;~ ldi temp,0b000000010 ;8 Prescale 600000 Overflows per sec /60 = 10000 Overflows per sec CTC
119
;~ out TCCR0B,temp
120
121
;~ ldi temp,(1<<OCIE0A); Interrupt bei Overflow CTC
122
;~ out TIMSK0,temp
123
124
125
126
;ldi temp,(1<<ISC01)|(1<<ISC00) ; INT0 und INT1 auf fallende Flanke konfigurieren
127
;out MCUCR,temp
128
129
;ldi temp,0b01000000 ; INT0 aktivieren
130
;out GIMSK,temp
131
132
;ldi temp,0b01000000 ; INT0 aktivieren
133
;out GIFR,temp
134
135
sei ;Interrupts an
136
137
138
139
main:
140
141
lds temp,UCSR0A ; get USART flags
142
sbrs temp, UDRE0
143
rjmp main
144
145
ldi temp,'x'
146
sts UDR0,temp
147
148
rjmp main
Nachgemessen mit dem Oszi bleibt der TX Pin permanent auf HIGH, RX auf
LOW. Der Controller sendet also nichts. Mir geht es jetzt darum, ob es
eine Hardware oder Software Problem ist. Getestet wurde die selbst
gebaute Schaltung mit einem Atmega8, ebenfalls nur mit TX, funktionierte
wunderbar.
Der Controller wird wird mit 3.3V versorgt. MAX232 mit 5V, mit
Spannungsteiler an RX auf 3.3V für den Atmega48.
Mich würde nun intressieren, ob im Code irgend ein Fehler vorhanden ist,
bevor ich die Hardware umändere?
Danke für die Hilfe!
Das auslassen von UCSR0C hat etwas gebracht. Der AVR sendet. Leider
aber nur 00 obwohl er 'x' senden sollte. Verwede ich auch bein Senden
das Falsche Register UDRE0?
Bei mir Funktionierst jetzt auch. Mir kam
=>Divide clock by 8 internally; [CKDIV8=0] bei den Fuses in die Quere.
Besten dank für deine wertvolle Hilfe und Zeit :)
Vor dem Schreiben auf UDR0 sollte man eigentlich prüfen, ob der Sender
schon fertig ist. Das klappt hier nur deswegen, weil die Empfangsroutine
die Wiederholrate bestimmt. Hier die Routine aus dem Datenblatt:
Ja, ich weiß. Aber es ging nur darum, ob der selbstgebaute UART
Adapter(MAX232) auch funktioniert, wie gewünscht. Tut er in dem Fall.
Und der Code im Datenblatt Funktioniert beim Atmega48 anscheinend nicht,
da teile ins SRAM integriert sind(steht auch im Datenblatt) und nur per
LDS/STS zugreifbar sind.
Ich schreibe im ersten Augenblick keine Fertigen Programme, sondern
teste die einzelnen Komponenten separat, erleichtert das Debugging. Und
die sehen dann eher weniger Professionell aus := )
Matthias S. schrieb:> Vor dem Schreiben auf UDR0 sollte man eigentlich prüfen, ob der Sender> schon fertig ist...
Also diesen Kommentar verstehe ich nun nicht, genau das passiert hier
doch:
1
main:
2
3
lds temp,UCSR0A ; get USART flags
4
sbrs temp, UDRE0
5
rjmp main
6
7
ldi temp,'x'
8
sts UDR0,temp
9
10
rjmp main
Schließlich läuft das Programm sowohl bei Lukas G. als auch bei mir.
> Das klappt hier nur deswegen, weil die Empfangsroutine> die Wiederholrate bestimmt.
?
Welche Empfangsroutine?