PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Programm



anabolik
09.09.2005, 00:33
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:


#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_CP U)>>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])

anabolik
09.09.2005, 00:36
ach wo die smilies im code stehen, es ist eine acht.

kater
09.09.2005, 01:41
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.


void UART_transmit (unsigned char c);
void UART_transmit (unsigned char c) {
while (!(USR & (1<<UDRE))) {}
UDR = c;
}

PicNick
09.09.2005, 08:54
Über das Hyperterm gibt's bei uns auch was.
https://www.roboternetz.de/wiki/pmwiki.php?n=Main.TermHyper

Wie kommst du aus der while (1) -Schleife eigentlich raus ? ich konnt kein "break" finden, oder ich brauch eine neue Brille

anabolik
09.09.2005, 13:57
naja, will ich auch nicht. glaube ich :)
geht es überhaupt mit printf oder muss ich mit z.B. UDR = c; operieren.

anabolik
11.09.2005, 19:47
kann denn keiner eine konkrete antwort geben?
HELP!

SprinterSB
11.09.2005, 22:00
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.