Hallo zusammen,
vor kurzem bin ich auf die Idee gekommen, mich ein wenig mit Mikrocontrollern zu beschäftigen, d.h. ich bin noch absolut in den Anfängen.
Mein Problem ist es im Moment, ein Byte seriell über den USART einzulesen, das über die USB-Schnittstelle des PC ausgegeben wird.
Das Ganze würde ich gerne in Assembler programmieren.
Hardware :
ATmega 328P (mit 16MHZ)
Schnittstellenbaustein FT232
Der erste Schritt war die Konfiguration des USART ;
Dann sollte erst einmal ein Byte seriell ausgegeben werden :
Das funktioniert auch soweit, im Terminalprogramm kann die Übertragung des Bytes verfolgt werden.
Leider funktioniert der nächste Schritt, nämlich das Lesen eines Bytes, nicht.
(für den Test ist der Programmteil, der für das Senden zuständig ist, auskommentiert. Die Konfiguration des USART ist noch die Selbe)
Der Code wird in einer Endlosschleife wiederholt.
Eigentlich möchte ich in jedem Durchlauf prüfen, ob ein Zeichen im Empfangsregister ist und falls ja, das Zeichen auslesen und in den Speicher schreiben.
Wenn ich den Teil des Auslesen des Empfangsspeichers umgehe, dann landet das (testweise "geschickte") Byte auch im Speicher
Ich hoffe, es kann mir einer von euch einen Tip geben, was ich falsch mache.
Gruß
JK
vor kurzem bin ich auf die Idee gekommen, mich ein wenig mit Mikrocontrollern zu beschäftigen, d.h. ich bin noch absolut in den Anfängen.
Mein Problem ist es im Moment, ein Byte seriell über den USART einzulesen, das über die USB-Schnittstelle des PC ausgegeben wird.
Das Ganze würde ich gerne in Assembler programmieren.
Hardware :
ATmega 328P (mit 16MHZ)
Schnittstellenbaustein FT232
Der erste Schritt war die Konfiguration des USART ;
Code:
//Einstellen der Baudrate über die Register UBRR0H / UBRR0L
//Formel für Berechnung UBRR = (CPU_Freq/(16*Baud))-1
//Ergibt bei 16000000Hz und 9600Baud = 103,17 bzw 0x0067
//Register mit berechnetem Wert UBRR laden
ldi r16,0x00
sts UBRR0H,r16
ldi r16,0x67
sts UBRR0L,r16
//aktivieren von receiver and transmitter
ldi r16,(1<<RXEN0)|(1<<TXEN0)
sts UCSR0B,r16
//datenformat setzen: 8data, 1stop bit
ldi r16, (1<<USBS0)|(3<<UCSZ00)
sts UCSR0C,r16
Dann sollte erst einmal ein Byte seriell ausgegeben werden :
Code:
//Zeichen Senden
StartZeichenSenden :
ldi r16,UCSR0A //r16 mit USART Control and Status Register (UCSR0A) laden
andi r16, 0x20 //prüfen, ob Bit 5 – UDRE0 gesetzt ist (1=transmitter buffer is ready for new data)
tst r16
brne transmBuffNotReady //wenn Bit 5 – UDRE0 = false ist, dann kein neues Zeichen senden
ldi r16,0x55
sts UDR0,r16
transmBuffNotReady :
//Zeitverzögerung
ldi r23,255
Verzoegerung3 :
ldi r24,LOW(0xFF)
ldi r25,HIGH(0xFF)
LoopVerzoegerung3 :
sbiw r25:r24,1
brne LoopVerzoegerung3
sbci r23,1
brne Verzoegerung3
rjmp StartZeichenSenden
Das funktioniert auch soweit, im Terminalprogramm kann die Übertragung des Bytes verfolgt werden.
Leider funktioniert der nächste Schritt, nämlich das Lesen eines Bytes, nicht.
(für den Test ist der Programmteil, der für das Senden zuständig ist, auskommentiert. Die Konfiguration des USART ist noch die Selbe)
Code:
//Zeichen einlesen
UartEinlesenStart :
ldi YH, HIGH(AnfangDatArray) //Y-Pointer wieder auf den Anfang vom Datenarray setzen
ldi YL, LOW(AnfangDatArray)
//Zeichen Empfangen
ldi r16,UCSR0A //r16 mit USART Control and Status Register (UCSR0A) laden
andi r16, 0x80 //prüfen, ob Bit 7 – RXC0 (USART Receive Complete) gesetzt ist (1=new data)
tst r16
brne transmBuffNoNewData //wenn Bit 7 – RXC0 gesetzt ist, dann ist ein ungelesenes Zeichen im Buffer
ldi r16,UDR0
st y,r16
transmBuffNoNewData :
Der Code wird in einer Endlosschleife wiederholt.
Eigentlich möchte ich in jedem Durchlauf prüfen, ob ein Zeichen im Empfangsregister ist und falls ja, das Zeichen auslesen und in den Speicher schreiben.
Wenn ich den Teil des Auslesen des Empfangsspeichers umgehe, dann landet das (testweise "geschickte") Byte auch im Speicher
Code:
//Zeichen einlesen
UartEinlesenStart :
ldi YH, HIGH(AnfangDatArray) //Y-Pointer wieder auf den Anfang vom Datenarray setzen
ldi YL, LOW(AnfangDatArray)
//Zeichen Empfangen
ldi r16,UCSR0A //r16 mit USART Control and Status Register (UCSR0A) laden
andi r16, 0x80 //prüfen, ob Bit 7 – RXC0 (USART Receive Complete) gesetzt ist (1=new data)
tst r16
[COLOR="#FF0000"]//[/COLOR]brne transmBuffNoNewData //wenn Bit 7 – RXC0 gesetzt ist, dann ist ein ungelesenes Zeichen im Buffer
ldi r16,[COLOR="#FF0000"]100//UDR0[/COLOR]
st y,r16
transmBuffNoNewData :
Ich hoffe, es kann mir einer von euch einen Tip geben, was ich falsch mache.
Gruß
JK