PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Programm Läuft nicht richtig,hilfen Sie mir mal



janboejle
07.06.2005, 18:22
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?




.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











[/list]

PicNick
07.06.2005, 19:45
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

izaseba
08.06.2005, 01:11
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 (http://www.avr-asm-tutorial.net/avr_de/index.html) oder das (http://www.mikrocontroller.net/tutorial/) empfehlen.
Dort findest Du genug Beispiele wie man sowas auf die Beine stellt.

viel Erfolg
Sebastian

janboejle
08.06.2005, 16:29
dank dir izaseba

wess du ist die initialisierung von UART richtig?

izaseba
08.06.2005, 21:49
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


Als 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.
Gruß Sebastian