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
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
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
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
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
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
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.