-         

Ergebnis 1 bis 8 von 8

Thema: Senden von zeichen funzt nicht

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36

    Senden von zeichen funzt nicht

    Anzeige

    Ich habe hier mal für meinen ATmega168 was geschrieben
    er soll eig nur warte mit einer Baudrate von 2400 1 stop bit und in 8ter frame an meine rechner senden. Wenn man simuliert geht alle nur aufen chip will es nicht funktionieren.


    Code:
    .include "m168def.inc"
     
    .def temp    = r16                              ; Register für kleinere Arbeiten
    .def zeichen = r17                              ; in diesem Register wird das Zeichen an die
                                                    ; Ausgabefunktion übergeben
     
    .equ UBRR_VAL   = 207  
    
    
    ; Stackpointer initialisieren
    ldi temp,HIGH(RAMEND)
    out SPH,temp
    ldi temp,LOW(RAMEND)
    out SPL,temp
    
    
    	sbi		PORTD, PD6
    	sbi     DDRD,PD6
    
    
    
     
        ; Baudrate einstellen
     
        ldi     temp, HIGH(UBRR_VAL)
        sts     UBRR0H, temp
        ldi     temp, LOW(UBRR_VAL)
        sts     UBRR0L, temp
     
        ; Frame-Format: 8 Bit
     
        ldi     temp, (3<<UCSZ00)
        sts     UCSR0C, temp
     
    	
     	ldi     temp, 0x08
        sts     UCSR0B,temp                 ; TX aktivieren
     
    loop:
        ldi     zeichen, 'T'
        rcall   serout                      ; Unterprogramm aufrufen
        ldi     zeichen, 'e'
        rcall   serout                      ; Unterprogramm aufrufen
        ldi     zeichen, 's'
        rcall   serout                      ; ...
        ldi     zeichen, 't'
        rcall   serout
        ldi     zeichen, '!'
        rcall   serout
        ldi     zeichen, 10
        rcall   serout
        ldi     zeichen, 13
        rcall   serout
        rjmp    loop
     
    serout:
    		
        sbi     PORTB,PB0
    	sbi     DDRB, PB0
    	ldi     temp,UCSR0A
        sbrs    temp,6                    ; Warten bis UDR für das nächste                                    ; Byte bereit ist
        rjmp    serout
        sts     UDR0, zeichen
        ret                                 ; zurück zum Hauptprogramm

    Ps: Der prozessor ist ein einem Asuro drin der mit dem Eval board aufgerüstet wurde.

    MFG ALBI

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    Du schreibst ASURO, willst du die Daten dann auch per IR senden ?
    Dann sollte man evtl. mit dem Timer die IR-Diode blinken lassen, damit der Empfänger das Signal auch erkennt. Schau in die Lib vom Asuro, wegen dem Timer.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Ja ich möchte über IR-testen ich habe das Programm auch schona auf dem ATmega8 ok mit anderen Register Namen also um geneau zu sein habe ich das von hier kopiert: http://www.mikrocontroller.net/artic...Tutorial:_UART und beim ATmega8 funktioniert es eig ganz gut. ach ja und der ATmega168 läuft wegen externen 8Mhz quarz auch nur mit 8000000 Hz von daher müsste es stimmen. die IR Diode wir meine ich zumindest nur zum empfangen benötgt

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.03.2006
    Ort
    WOB
    Beiträge
    630
    Die Diode ist doch generell die Schnittstelle für die Serielle Kommunikation oder?
    Gruß Thomas \/

    Alles über AVR, PIC und CAN
    blog.cc-robotics.de

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Nein ist sie nicht also
    die Diode ist nur mit PD1 verbunden
    da ist das TXD pin also Tranceive Data (warum eig das x?) naja auch egal

    Das RXD (Receive Data) ist an PD0 und wird mit dem .....
    dieses viereckige Ding mit dem halben Kreis oben drauf verbunden

    so zumindest laut Schaltplan

    Auf dem Asuro geh ich mal stark von aus das die IR-Diode die schwarze da ist also und daneben ist dann auch das viereckige ding mit dem halb kreis drauf.

    dementsprechend ist das dann das Teil was zum empfangen da ist

    naja zu meinem Problem ich bin zu dem Schluß gekommen das mein viereckiges ding mit halb kreis oben rauf kaputt ist

    EDIT "Sorry war bei einem programm zum empfangen das hier soll ja senden"

  6. #6
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Die IR Diode ist an TXD = PD1 und ist zum Senden.
    Der Empfänger ist ein dreipoliger Baustein an RXD = PD0.

    Wenn der der normale IR empfänger benutzt wird, reicht es nicht die Daten per UART auszugeben, man muss auch noch für die Modulation mit ca. 36 kHz sorgen, damit der empfänger die Daten richtig empfängt.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    Sorry bin drucheinander
    also:
    RXD (eingang) Empfänger (viereck Teil)
    TXD (ausgang) Sender (Diode)

    Hmm stimmt also muss ich mit Timer im CTC Modus arbeiten
    jetzt aber warum funzt dann das prog von mikrocontroller.net
    Code:
    .include "m8def.inc"
     
    .def temp    = r16                              ; Register für kleinere Arbeiten
    .def zeichen = r17                              ; in diesem Register wird das Zeichen an die
                                                    ; Ausgabefunktion übergeben
     
    .equ F_CPU = 4000000                            ; Systemtakt in Hz
    .equ BAUD  = 9600                               ; Baudrate
     
    ; Berechnungen
    .equ UBRR_VAL   = ((F_CPU+BAUD*8)/(BAUD*16)-1)  ; clever runden
    .equ BAUD_REAL  = (F_CPU/(16*(UBRR_VAL+1)))      ; Reale Baudrate
    .equ BAUD_ERROR = ((BAUD_REAL*1000)/BAUD-1000)  ; Fehler in Promille
     
    .if ((BAUD_ERROR>10) || (BAUD_ERROR<-10))       ; max. +/-10 Promille Fehler
      .error "Systematischer Fehler der Baudrate grösser 1 Prozent und damit zu hoch!"
    .endif
     
        ; Stackpointer initialisieren
     
        ldi     temp, LOW(RAMEND)
        out     SPL, temp
        ldi     temp, HIGH(RAMEND)
        out     SPH, temp
     
        ; Baudrate einstellen
     
        ldi     temp, HIGH(UBRR_VAL)
        out     UBRRH, temp
        ldi     temp, LOW(UBRR_VAL)
        out     UBRRL, temp
     
        ; Frame-Format: 8 Bit
     
        ldi     temp, (1<<URSEL)|(3<<UCSZ0)
        out     UCSRC, temp
     
        sbi     UCSRB,TXEN                  ; TX aktivieren
     
    loop:
        ldi     zeichen, 'T'
        rcall   serout                      ; Unterprogramm aufrufen
        ldi     zeichen, 'e'
        rcall   serout                      ; Unterprogramm aufrufen
        ldi     zeichen, 's'
        rcall   serout                      ; ...
        ldi     zeichen, 't'
        rcall   serout
        ldi     zeichen, '!'
        rcall   serout
        ldi     zeichen, 10
        rcall   serout
        ldi     zeichen, 13
        rcall   serout
        rjmp    loop
     
    serout:
        sbis    UCSRA,UDRE                  ; Warten bis UDR für das nächste
                                            ; Byte bereit ist
        rjmp    serout
        out     UDR, zeichen
        ret                                 ; zurück zum Hauptprogramm
    wo wird da denn die Freq eingestellt ?
    also das funzt beim ATmega8 und das habe ichgenomm und einfach auf den ATmega168 umgeschreiben



    EDIT:"kann es sein das der Timer im CTC modus noch an ist da der im Bootlaoder benutzt wird?"

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Das Programm dort ist nicht für den Asuro geschrieben! Wenn man die Verbindung per Kabel herstellt, braucht man die 36kHz nicht.

    EDIT:"kann es sein das der Timer im CTC modus noch an ist da der im Bootlaoder benutzt wird?"
    Könnte sein...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •