Gast
#340131
Hallo zusammen, ich habe mich zum ersten Mal an den Timer0 gewagt und schon funktioniert es nicht mehr. Ich habe ein einfach Testprogramm geschrieben, welches auf dem STK500 abläuft. Tasten 0-3 werden auf den entsprechenden LEDs ausgegeben. Im Hintergrund läuft der Timer0 mit Overflow-Interrupt. Bei Interrupt werden die Tasten 4-7 abgefragt und auf den LEDs ausgegeben. Ausserdem sollen Zeichen über die RS232 Schnittstelle gesendet werden. Aber er bleibt irgendwo hängen. Wenn ich die folgenden 2 Zeilen ausdokumentiere, sendet er zwar etwas, aber es funktioniert nicht richtig: sbis UCSRA,UDRE ;HIER LIEGT DAS PROBLEM rjmp USART_Transmit Ich habe das komplette Programm unten eingefügt. Die Routine zum Senden funktioniert alleine wunderbar. Ich habe sie schon mehrfach verwendet. Aber irgendetwas scheint den Befehl oben zu beeinflussen - aber ich habe keine Ahnung was. Ich hoffe, jemand kann mir den Fehler sagen, den ich da eingebaut habe. :-) Im Voraus vielen Dank. Gruß Markus .INCLUDE "m16def.inc" .DEF akku = r16; .DEF temp = r17; .DEF seku = r18; .DEF send = r19; .CSEG rjmp start .ORG $012 rjmp timer0 .ORG $030 start: ldi akku,LOW(RAMEND); out SPL,akku; ldi temp, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, temp ldi akku,$ff ;PortB als Ausgang out DDRB,akku ldi akku, 0b010 ;Timer0 Einstellungen out TCCR0, akku in akku, TIMSK ori akku, 0b00000001 out TIMSK, akku rcall USART_Init ;Initialisierung USART sei abfrage: in akku, PINA ;SW0 - SW3 auf LED0 - LED3 ausgeben andi akku, 0b00001111 ori akku, 0b11110000 out PORTB, akku rjmp abfrage timer0: cli ;Interrupts ausschalten taste: in akku, PINA ;SW4 - SW7 auf LED4 - LED7 ausgeben andi akku, 0b11110000 ori akku, 0b00001111 out PORTB, akku rcall zeichen ;Zeichen senden cpi akku, 0b11111111 brne taste ;schleife, wenn taste weiterhin gedrückt sei ;Interrupts einschalten reti USART_Init: ;set baud rate ldi r17,0 ldi r16, 23 out UBRRH, r17 out UBRRL, r16 ;Enable receiver and transmitter ldi r16, (0<<RXCIE) | (0<<RXEN) | (1<<TXEN) out UCSRB,r16 ;set frame format: 8data, 1stop bit ldi r16, (1<<URSEL) | (0<<USBS) | (3<<UCSZ0) out UCSRC,r16 ret USART_Receive: sbis UCSRA, RXC rjmp USART_Receive in send, UDR out PORTB, temp ret USART_Transmit: sbis UCSRA,UDRE ;HIER LIEGT DAS PROBLEM, bei ausdokumentieren funktioniert es, aber nicht richtig rjmp USART_Transmit out UDR,temp ret zeichen: ldi temp, 0x81 rcall USART_Transmit ldi temp, 0x82 rcall USART_Transmit ret