RS232 mit AT91SAM7S256

Gast #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
Gast
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
Gast
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
Gast
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
Gast
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
Gast
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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.