Forum: Mikrocontroller und Digitale Elektronik RS232 mit AT91SAM7S256


von peter (Gast)


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

von Stephan (Gast)


Lesenswert?

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

von peter (Gast)


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

von Stephan (Gast)


Lesenswert?

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

von Stephan (Gast)


Lesenswert?

Hi,
noch kein Kaffee gehabt, das letzte ist ja BIT6.
sorry

Stephan

von Peter (Gast)


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

von Stephan (Gast)


Lesenswert?


von peter (Gast)


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

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
Noch kein Account? Hier anmelden.