Mikrocontroller und Digitale Elektronik
›
Thread
RS232 mit AT91SAM7S256
P
peter
Gast
20.10.2010 23:18
#1905364
Hallo NG,
ich möchte gerne auf dem Seriellen Port des AT91SAM7S256 Texte schicken.
Dazu habe ich folgende zwei Funktionen (siehe unten)
zunächst würde ich init_usart0 aufrufen und dann in r8 mein Zeichen
schreiben und write_char aufrufen.
Mein Problem ist, dass das Warten aud "ready" eine Endlosschleife
erzeugt. Was könnte denn das Problem sein?
Vielen Dank schon jetzt für jeden Tip!
Peter
--
write_char:
// -----------------------------------------------------------
// warten auf ready
ready:
// -----------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
LDR r1, [r0, #USART_US_CSR]
AND r1, r1, #BIT2
CMP r1, #1
BNE ready
// Wert an Basisadresse + Offset schreiben
ADD r8, r8, #256
STR r8, [r0, #USART_US_THR]
// -----------------------------------------------------------
// Zurueck aus Subroutine
MOV pc, r14
init_usart0:
// -----------------------------------------------------------
// Basisadresse setzen
LDR r0, =PIO_BASE
// zu schreibender Wert
LDR r1, =BIT5 | BIT6 | BIT21 | BIT22
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PIO_PDR]
// zu schreibender Wert
LDR r1, =BIT5 | BIT6 | BIT21 | BIT22
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PIO_ASR]
// zu schreibender Wert
LDR r1, =0
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PIO_BSR]
// -----------------------------------------------------------
// Basisadresse setzen
LDR r0, =PMC_BASE
// zu schreibender Wert
LDR r1, =BIT7
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PMC_PCER]
// -----------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
// zu schreibender Wert
LDR r1, =313
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_BRGR]
// zu schreibender Wert
LDR r1, =0
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_TTGR]
// zu schreibender Wert
LDR r1, =2240
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_MR]
// ----------------------------------------------------------
// Basisadresse setzen
LDR r0, =PDC_BASE
// zu schreibender Wert
LDR r1, =256 | 1
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PDC_PTCR]
// ----------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
// zu schreibender Wert
LDR r1, =80
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_CR]
// ---------------------------------------------------------
// Zurueck aus Subroutine
MOV pc, r14
S
Stephan
Gast
20.10.2010 23:37
#1905388
Hi
bin zwar kein ASM-ARM Programmierer, aber das ist mit aufgefallen:
1 LDR r1 , [ r0 , # USART_US_CSR ]
2 AND r1 , r1 , # BIT2 // r1 = r1 und 0b00000100
3 CMP r1 , # 1 // r1 == 0b00000001
4 BNE ready // != 1 -> jump to ....
wie soll hier r1 auf 1 gesetzt werden?
Wenn ich das richtig verstanden habe, kann nur ein Wert (0x04) grösser
NULL raus kommen oder gleich NULL.
mfg
Stephan
P
peter
Gast
21.10.2010 07:55
#1905493
Hallo Stephan,
sieht in der Tat falsch aus.
ich habe jetzt mal
ready:
// -----------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
LDR r1, [r0, #USART_US_CSR]
AND r1, r1, #BIT2
CMP r1, #BIT2
BNE ready
und
ready:
// -----------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
LDR r1, [r0, #USART_US_CSR]
AND r1, r1, #BIT1
CMP r1, #BIT1
BNE ready
probiert, aber leider funktioniert das auch nicht. Hat jemand einen Tip?
Kann es evtl. an der Initialisierung des USART liegen?
MfG
Peter
S
Stephan
Gast
21.10.2010 09:02
#1905572
Morgen,
so hab mir deine Sachen nochmal angesehen.
1 ready:
2 // -----------------------------------------------------------
3 // Basisadresse setzen
4 LDR r0 , = USART_BASE
5
6 LDR r1 , [ r0 , # USART_US_CSR ]
7 AND r1 , r1 , # BIT1
8 CMP r1 , # BIT1
9 BNE ready
Dies sollte richtig sein! BIT1 ist TX-READY !!!
aber dies: 1 // Basisadresse setzen
2 LDR r0 , = USART_BASE
3
4 // zu schreibender Wert
5 LDR r1 , = 80
6 // Wert an Basisadresse + Offset schreiben
7 STR r1 , [ r0 , # USART_US_CR ]
scheint nicht richtig zu sein! BIT7 ist TX-DISABLE !!
Du benötigst BIT6 hier für TX-ENABLE.
Wenn du C-Files lesen kannst nimm dir die Beispiele und die Libs von
Atmel zur Hilfe!!!
Bei der Init der USART macht Atmel noch mehr. (Reset, Disable usw.)
Stephan
S
Stephan
Gast
21.10.2010 09:03
#1905574
Hi,
noch kein Kaffee gehabt, das letzte ist ja BIT6.
sorry
Stephan
P
Peter
Gast
21.10.2010 12:25
#1905872
Hallo Stephan,
> Wenn du C-Files lesen kannst nimm dir die Beispiele und die Libs von
> Atmel zur Hilfe!!!
könntest Du bitte einen Link dazu posten?
Das mit dem Lesen sollte ich hinbekommen :-)
Vielen Dank,
Peter
S
Stephan
Gast
21.10.2010 12:49
#1905921
P
peter
Gast
21.10.2010 22:39
#1906831
Hallo NG,
wie Stefan schon sagte, man muss noch mehr Initialisieren.
So gehts jetzt mit 9600/8/N/1 (freu :-)
write_char:
// ------------------------------------------------------------
// warten auf ready
ready:
// ------------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
LDR r1, [r0, #USART_US_CSR]
AND r1, r1, #BIT1
CMP r1, #BIT1
BNE ready
// Wert an Basisadresse + Offset schreiben
ADD r8, r8, #256
//ldr r8, =(0x6A & 0x1FF) // sollte ein "j" ergeben, oder?
STR r8, [r0, #USART_US_THR]
// ------------------------------------------------------------
// Zurueck aus Subroutine
MOV pc, r14
init_usart0:
// -------------------------------------------------------------
// Basisadresse setzen
LDR r0, =PIO_BASE
// zu schreibender Wert
LDR r1, =(BIT5 | BIT6 | BIT21 | BIT22)
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PIO_PDR]
// zu schreibender Wert
LDR r1, =(BIT5 | BIT6 | BIT21 | BIT22)
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PIO_ASR]
// zu schreibender Wert
LDR r1, =0
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PIO_BSR]
//
--------------------------------------------------------------
// Basisadresse setzen
LDR r0, =PMC_BASE
// zu schreibender Wert
LDR r1, =1000000
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PMC_PCER]
//
--------------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
// zu schreibender Wert
LDR r1, =313
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_BRGR]
// zu schreibender Wert
LDR r1, =0
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_TTGR]
// zu schreibender Wert
// LDR r1, =100111000000b
LDR r1, =0x08c0
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_MR]
//
--------------------------------------------------------------
// Basisadresse setzen
LDR r0, =PDC_BASE
// zu schreibender Wert
LDR r1, =(256 | 1)
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #PDC_PTCR]
//
--------------------------------------------------------------
// Basisadresse setzen
LDR r0, =USART_BASE
// zu schreibender Wert
LDR r1, =0x50
// Wert an Basisadresse + Offset schreiben
STR r1, [r0, #USART_US_CR]
//
--------------------------------------------------------------
//Zurueck aus Subroutine
MOV pc, r14
↑ Nach oben
← Zurück zu Mikrocontroller und Digitale Elektronik
Antwort schreiben