Versteh' nicht ganz, welche Verbindung meinst du ?
Unter der Annahme, daß die Baudrate etc. stimmt, sollte der Timer ja ansprechen und auch senden.
Allerdings sind die Daten (1 - 8 ) auf einem Terminal nicht gut zu lesen
es ist nur ein teile test programm, mickrontrolle AT90S8535 in STK200
über RS232 mit PC verbinden. signal nach jeder 5 Sekunden sollen Daten über UART transportiert werden .
Das heisst,nach jeder 5 sekunde wird Interrupt ausgelöst,und daten über UART senden.
ich denke, bei mein Programm fehlt etwa verbindung zw Senden und Interrupt,aber ich weis nicht wie ich es korrigieren.
könnte jemand mir helfen?
[/list]Code:.include"8535def.inc" .def temp=r16 .def infor=r19 .def laenger=r20 .def kommando=r21 .equ quartz=2457600 ;Seite 60,64,XTAL->Baudrategenerator .equ baud=9600 .equ start=65536-39060 .equ highvalue=high(start) .equ lowvalue=low(start) .org 0X000 rjmp reset ;reset handler .org 0X008 rjmp TIM1_OVF ;time1 overflow handler reset: ldi temp,low(RAMEND) out spl,temp ;Seite 21 ldi temp,high(RAMEND) ;Stackpoint initialisieren out sph,temp ldi temp,1<<TXEN ;Seite 63 out UCR,temp ;Seite 64 ldi temp,quartz/(baud*16)-1 out UBRR,temp ; UART initialisieren ldi temp,1<<TOIE1 out TIMSK,temp ;time1 interrupt ein , Seite 27 ldi temp,0b00000101 ;Seite 38 out TCCR1B,temp ;bit2-0 define the Prescaling ;source of Timer/Counter1 sei ;interrupts generelle aktivieren loop: ldi temp,1 mov r1,temp ldi temp,2 mov r2,temp ldi temp,3 mov r3,temp ldi temp,4 mov r4,temp ldi temp,5 mov r5,temp ldi temp,6 mov r6,temp ldi temp,7 mov r7,temp ldi temp,8 mov r8,temp rjmp loop senden: mov temp,r1 rcall senden2 mov temp,r2 rcall senden2 mov temp,r3 rcall senden2 mov temp,r4 rcall senden2 mov temp,r5 rcall senden2 mov temp,r6 rcall senden2 mov temp,r7 rcall senden2 mov temp,r8 rcall senden2 ret senden2: sbis USR,UDRE ;skip if bit in I/O register set rjmp senden2 ;warten bis UDR fuer naechster Btyte out UDR,temp ;bereit ist, Datenblatte Seite 62 ret TIM1_OVF: ldi temp,highvalue out TCNT1H,temp ;Datenblaette Seite 38 ldi temp,lowvalue ;Startwert des Timers einstellen out TCNT1L,temp ;39060 Takt ist 5 Sekunde ;nach 5 sekunde ist interrupt ausgeloest rcall senden ;aufrufen Senden Funktion reti
Versteh' nicht ganz, welche Verbindung meinst du ?
Unter der Annahme, daß die Baudrate etc. stimmt, sollte der Timer ja ansprechen und auch senden.
Allerdings sind die Daten (1 - 8 ) auf einem Terminal nicht gut zu lesen
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Hallo,
So wie ich das sehe muß Du in der resetroutine den Startwert des Timers in TCNT1 laden
(in deinem Beispiel highvalue und lowvalue).
Das machst Du zwar schön in dem Interrupthandler (ist ja korekt, weil er nachdem er ablaufen ist, neu belegt werden soll), aber am Anfang machst Du das nicht.
Meiner Meinung nach wird bei Deinem Beispiel nie ein Interrupt ausgelöst.
Schreib also die ersten 4 Zeilen vom TIM1_OVF nochmal irgendwo in den resethandler
Was mir sonst noch aufgefallen ist, Deine loop: Schleife wozu schiebst Du die Register hin und her?
in meinen Augen kannst Du auch in der resetroutine die Register R1 bis R8 belegen und gut ist es.
Du tust die sowieso nirgendwo mehr verändern.
Du sendest zahlen 1-9 an UART, müßen die nicht in ASCII format vorliegen ?
Das wäre das wichtigste.
Wenn ich was falsch geschrieben habe, wäre ich froh wenn man micht darauf aufmerksam macht.
Ich kann Dir nur das oder das empfehlen.
Dort findest Du genug Beispiele wie man sowas auf die Beine stellt.
viel Erfolg
Sebastian
dank dir izaseba
wess du ist die initialisierung von UART richtig?
Hallo,
Ich will hier nicht Faul erscheinen, aber ich füge hier ein Ausschnitt von mikrocontroller.net
wie man die UART Schnittstelle initialisieren soll.
Es bezieht sich zwar auf Mega8 bzw. auf AT90S4433, das Prinzip sollte aber gleich sein.
Eventuell im Datenblatt bzw. in *.inc nachlesen, ob die Register genauso heißen
Gruß SebastianAls erstes muss die gewünschte Baudrate im Register UBRR festgelegt werden. Der in dieses Register zu schreibende Wert errechnet sich nach der folgenden Formel:
UBRR = Taktfrequenz / 16 * Baudrate - 1
Beim AT90S4433 kann man den Wert direkt in das Register UBRR laden, beim ATmega8 gibt es für UBRR zwei Register: UBRRL (Low-Byte) und UBRRH (High-Byte). Im Normalfall steht im UBRRH 0, da der berechnete Wert kleiner als 256 ist und somit in UBRRL alleine passt.
Um den Sendekanal des UART zu aktivieren, muss das Bit TXEN im UART Control Register UCSRB auf 1 gesetzt werden.
Danach kann das zu sendende Byte in das Register UDR eingeschrieben werden - vorher muss jedoch sichergestellt werden, dass das Register leer ist, die vorhergehende Übertragung also schon abgeschlossen wurde. Dazu wird getestet, ob das Bit UDRE ("UART Data Register Empty") im Register UCSRA auf 1 ist.
Genaueres über die UART-Register findet man im Datenblatt des Controllers.
Der ATmega8 bietet noch viele weitere Optionen zur Konfiguration des UARTs, aber für die Datenübertragung zum PC sind im Normalfall keine anderen Einstellungen notwendig.
Das Beispielprogramm überträgt die Zeichenkette "Test!" in einer Endlosschleife an den PC. Die folgende Version ist für den ATmega8 geschrieben; wer den AT90S4433 verwendet findet die passende Version hier.
Lesezeichen