mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RS232 mit AT91SAM7S256


Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
bin zwar kein ASM-ARM Programmierer, aber das ist mit aufgefallen:
  LDR  r1, [r0, #USART_US_CSR]
  AND   r1, r1, #BIT2    // r1 = r1 und 0b00000100
  CMP  r1,   #1   // r1 == 0b00000001
  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

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Morgen,

so hab mir deine Sachen nochmal angesehen.
ready:
  // -----------------------------------------------------------
    // Basisadresse setzen
  LDR r0, =USART_BASE

  LDR  r1, [r0, #USART_US_CSR]
  AND   r1, r1, #BIT1
  CMP  r1,   #BIT1
  BNE  ready

Dies sollte richtig sein! BIT1 ist TX-READY !!!

aber dies:
// Basisadresse setzen
  LDR r0, =USART_BASE

  // zu schreibender Wert
  LDR r1, =80
  // Wert an Basisadresse + Offset schreiben
  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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
noch kein Kaffee gehabt, das letzte ist ja BIT6.
sorry

Stephan

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.