- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 7 von 7

Thema: UART Programm

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    53

    UART Programm

    Anzeige

    Powerstation Test
    hallo.
    ich habe mein programm, welches tastendrücke bis 7 zählen und dann binär auf leds ausgeben soll (dies funktioniert ), jetzt um UART-ansteuerung erweitert. jetzt soll es beim zählvorgang bzw. beim betätigen des tasters "Eins", "Zwei", "Drei" u.s.w. zu HyperTerminal ausgeben. es funktioniert leider nicht. leute könnt ihr mir helfen. ach noch was was muss man bei HyperTerminal alles einstellen oder gibt es eine bessere alternative. ich hatte baudrate:9600, datenbits:8, parität:keine, stopbits:1, .

    hier mein code:

    Code:
    #include <inttypes.h>
    #include <avr/io.h>
    #include <avr/delay.h> // definiert _delay_ms()
    #include <stdint.h>
    #ifndef F_CPU
    #define F_CPU 8000000           /* Oszillator-Frequenz in Hz */
    #endif
    #define UART_BAUD_RATE 9600
    #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_CPU)/((UART_BAUD_RATE)*16L)-1)
    
    int main(void)
    {
    
    DDRD=0x00;// defeniert portD als Eingänge
    DDRB=0x07;// defeniert portB0 bis portB2 als Ausgänge
    
    PORTD=0x04;// bit 2 auf portD wird gesetzt PullUp
    int i=0; // Definition der Laufvariable
    
    UCSRB |= (1<<TXEN);			//UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);	//Asynchron 8N1
    UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
    UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit 
    
    
    while(1){
    
    if(!(PIND & (1<<PIND2))){  // Abfrage von pinD2  ob da eine 0 anliegt bzw. pinD2 wird mit dem Taster auf masse gezogen d.h. Taster wurde betätigt 
        _delay_ms(100); // Tastenentprellung
       if((PIND & (1<<PIND2))){ // Abfrage von pinD2  ob da eine 1 anliegt bzw. Taster losgelassen wurde 
        _delay_ms(100);// Zeit zum Loslassen
    	i=i+1; //Zählvorgang
       }
    }
    
    if(i==0){ // wenn i=0 ist soll
    PORTB=0x00; // an portB nichts ausgegeben werden
    }
    if(i==1){ // wenn i=1 ist soll
    PORTB=0x01;// an portB0 eine eins ausgegeben werden
    while (!(UCSRA & (1<<UDRE))); //warten bis Senden möglich   
    printf("%s: stdout Eins___\n");
    }
    if(i==2){ // wenn i=2 ist soll
    PORTB=0x02; // an portB1 eine eins ausgegeben werden
    while (!(UCSRA & (1<<UDRE))); //warten bis Senden möglich   
    printf("%s: stdout Zwei___\n");
    }
    if(i==3){ // wenn i=3 ist soll
    PORTB=0x03; // an portB1 und portB0 eine eins ausgegeben werden
    while (!(UCSRA & (1<<UDRE))); //warten bis Senden möglich   
    printf("%s: stdout Drei___\n");
    }
    if(i==4){ // und
    PORTB=0x04;
    while (!(UCSRA & (1<<UDRE))); //warten bis Senden möglich   
    printf("%s: stdout Vier___\n");
    }
    if(i==5){ //so 
    PORTB=0x05;
    while (!(UCSRA & (1<<UDRE))); //warten bis Senden möglich   
    printf("%s: stdout Fünf___\n");
    }
    if(i==6){ //weiter
    PORTB=0x06;
    while (!(UCSRA & (1<<UDRE))); //warten bis Senden möglich   
    printf("%s: stdout Sechs___\n");
    }
    if(i==7){
    PORTB=0x07;
    while (!(UCSRA & (1<<UDRE))); //warten bis Senden möglich   
    printf("%s: stdout Sieben___\n");
    }
    if(i==8){ //wenn i=8 ist
    i=0;      // i 0 setzen
    }
    }
    }
    ( Codetag eingebaut, damit werden auch die Smilies wieder zu 8ten, Kjion [Moderator])

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    53
    ach wo die smilies im code stehen, es ist eine acht.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    01.08.2005
    Ort
    49.80248 8.59252
    Alter
    40
    Beiträge
    172
    Normal schreibt man die Daten die zu senden sind in das UDR Register. In den ganzen beispielen die hier rumlungern macht man das auch mit so einer Funktion fuer das senden.
    Code:
    void UART_transmit (unsigned char c);
    void UART_transmit (unsigned char c) {
    	while (!(USR & (1<<UDRE))) {}
    	UDR = c;
    }

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Über das Hyperterm gibt's bei uns auch was.
    https://www.roboternetz.de/wiki/pmwi...Main.TermHyper

    Wie kommst du aus der while (1) -Schleife eigentlich raus ? ich konnt kein "break" finden, oder ich brauch eine neue Brille
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    53
    naja, will ich auch nicht. glaube ich
    geht es überhaupt mit printf oder muss ich mit z.B. UDR = c; operieren.

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    31.08.2005
    Beiträge
    53
    kann denn keiner eine konkrete antwort geben?
    HELP!

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    Re: UART Programm

    Zitat Zitat von anabolik
    ach noch was was muss man bei HyperTerminal alles einstellen oder gibt es eine bessere alternative. ich hatte baudrate:9600, datenbits:8, parität:keine, stopbits:1.
    Die Einstellungen kannst du von HyperTerm aus speichern und später wieder öffnen. Oder mach dir ne Verknüpfung mit der .ht-Datei als Argument von HyterTerm.

    printf()...woher solldas denn wissen, ob es auf UDR schreiben soll???

    Bestenfalls ein sprintf() wenn dein Flash noch Platz dafür hat, und dann selber ausgeben.
    Disclaimer: none. Sue me.

Berechtigungen

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

Labornetzteil AliExpress