anabolik
09.09.2005, 01: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])
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])