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
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
Noch kein Account?
Die Registrierung ist kostenlos und dauert nur eine Minute.
Jetzt registrieren