Chattychan
20.12.2006, 18:05
Hallo,
ich habe den folgenden C-Code aus der Forumsuche zusammengebastelt.
Klappt auch soweit. Ich compiliere es mit WinAVR, schicks mit Ponyprog hoch und
schau es mit im Bascom Terminal an.
Wenn ich allerdings jetzt eine der 5 Tasten drücke dann bekomme ich einen
Rückgabewert der Tastenabfrage() Funktion die sich nicht genau auf eine
bestimmte Taste beziehen lässt. Also zb Taste 1 zwischen 375 und 500 je nach
dem wie lange ich die Taste drücke und zudem schwankend aber bei Taste 2 etc genauso bzw ähnlich.
Nicht ganz genauso, einen kleinen Unterschied kann man sehen. Aber minimal.
Ich nehm an das ganze lässt sich mit einem Prescaler lösen, zumindest wird
das im BASCOM Beispiel so gemacht. Nur hab ich keine Ahnung wie ich das
machen soll. Bin noch Anfänger in C und den Microcontrollern.
Die IF Abfragen in der Main Methode hab ich selbst geschrieben um eine
sinnvolle Fallunterscheidung machen zu können. Leider mit o.g. Problem.
Wäre super wenn mir jemand erklären könnte wie ich jetzt weiterkomme
oder kurz meinen Code ergänzt so dass es klappt.
// AVR-Includes
#include <avr/io.h>
// Defines
#define F_CPU 16000000 // Hier die Taktfrequenz in Hz eingeben
#define UART_BAUD_RATE 9600 // Hier die gewnschte Baudrate
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16L)-1)
// Funktionen
// -=> UART initialisieren <=-
void UART_init(void){
UBRRL |= (uint8_t) UART_BAUD_SELECT;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
// -=> Byte Transmit <=-
void UART_transmit(uint8_t c){
while(!(UCSRA & (1<<UDRE)));
UDR = c;
}
// -=> String Transmit <=-
void UART_transmit_string(uint8_t *string){
while(!(UCSRA & (1<<UDRE)));
while( *string){ UART_transmit (*string++); }
}
unsigned int Tastenabfrage (void)
{
unsigned char i;
unsigned char Tasternr = 0;
unsigned int Tasteradc = 0;
PORTA |= (1<<PA7); /* internen Pull-Up an PA7 aktivieren */
ADCSRA = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler hier: 128
ADMUX = (0<<MUX4) |(0<<MUX3) |(1<<MUX2) | (1<<MUX1) | (1<<MUX0);
ADMUX &= (0<<ADLAR); // Standard Ausrichtung
ADMUX &= (0<<REFS1) & (0<<REFS0); // Referenzspannung an AREF nutzen
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
for(i=0;i<4;i++)
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
Tasteradc += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
Tasteradc /= 4; // Summe durch vier teilen = arithm. Mittelwert
return Tasteradc;
}
int main (void)
{
char c;
unsigned int taste = 0;
UART_init(); // UART-Init Funktion ausfhren
UART_transmit_string("Hurra, es funktioniert!!!");
while(1){
while(taste == 0) {
taste = Tastenabfrage();
}
if((taste > 350)&&(taste<375)) {
UART_transmit_string("350 - 375 ");
taste = 0;
}
if((taste > 374)&&(taste<400)) {
UART_transmit_string("374 - 400 ");
taste = 0;
}
if((taste > 399)&&(taste<425)) {
UART_transmit_string("399 - 425 ");
taste = 0;
}
if((taste > 424)&&(taste<450)) {
UART_transmit_string("424 - 450 ");
taste = 0;
}
if((taste > 449)&&(taste<475)) {
UART_transmit_string("449 - 475 ");
taste = 0;
}
if((taste > 474)&&(taste<500)) {
UART_transmit_string("474 - 500 ");
taste = 0;
}
if((taste > 499)&&(taste<525)) {
UART_transmit_string("499 - 525 ");
taste = 0;
}
if((taste > 524)&&(taste<550)) {
UART_transmit_string("524 - 550 ");
taste = 0;
}
if((taste > 3000)&&(taste<4000)) {
UART_transmit_string("300 - 400 ");
taste = 0;
}
if((taste > 4000)&&(taste<5000)) {
UART_transmit_string("400 - 500");
taste = 0;
}
if((taste > 500)&&(taste<1000)) {
//UART_transmit_string("Nix gedruckt ");
taste = 0;
}
}
}
Vielen Dank im voraus
LG
Thomas
ich habe den folgenden C-Code aus der Forumsuche zusammengebastelt.
Klappt auch soweit. Ich compiliere es mit WinAVR, schicks mit Ponyprog hoch und
schau es mit im Bascom Terminal an.
Wenn ich allerdings jetzt eine der 5 Tasten drücke dann bekomme ich einen
Rückgabewert der Tastenabfrage() Funktion die sich nicht genau auf eine
bestimmte Taste beziehen lässt. Also zb Taste 1 zwischen 375 und 500 je nach
dem wie lange ich die Taste drücke und zudem schwankend aber bei Taste 2 etc genauso bzw ähnlich.
Nicht ganz genauso, einen kleinen Unterschied kann man sehen. Aber minimal.
Ich nehm an das ganze lässt sich mit einem Prescaler lösen, zumindest wird
das im BASCOM Beispiel so gemacht. Nur hab ich keine Ahnung wie ich das
machen soll. Bin noch Anfänger in C und den Microcontrollern.
Die IF Abfragen in der Main Methode hab ich selbst geschrieben um eine
sinnvolle Fallunterscheidung machen zu können. Leider mit o.g. Problem.
Wäre super wenn mir jemand erklären könnte wie ich jetzt weiterkomme
oder kurz meinen Code ergänzt so dass es klappt.
// AVR-Includes
#include <avr/io.h>
// Defines
#define F_CPU 16000000 // Hier die Taktfrequenz in Hz eingeben
#define UART_BAUD_RATE 9600 // Hier die gewnschte Baudrate
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16L)-1)
// Funktionen
// -=> UART initialisieren <=-
void UART_init(void){
UBRRL |= (uint8_t) UART_BAUD_SELECT;
UCSRB = (1<<RXEN)|(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
// -=> Byte Transmit <=-
void UART_transmit(uint8_t c){
while(!(UCSRA & (1<<UDRE)));
UDR = c;
}
// -=> String Transmit <=-
void UART_transmit_string(uint8_t *string){
while(!(UCSRA & (1<<UDRE)));
while( *string){ UART_transmit (*string++); }
}
unsigned int Tastenabfrage (void)
{
unsigned char i;
unsigned char Tasternr = 0;
unsigned int Tasteradc = 0;
PORTA |= (1<<PA7); /* internen Pull-Up an PA7 aktivieren */
ADCSRA = (1<<ADEN) | (1<<ADPS2)| (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler hier: 128
ADMUX = (0<<MUX4) |(0<<MUX3) |(1<<MUX2) | (1<<MUX1) | (1<<MUX0);
ADMUX &= (0<<ADLAR); // Standard Ausrichtung
ADMUX &= (0<<REFS1) & (0<<REFS0); // Referenzspannung an AREF nutzen
ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
for(i=0;i<4;i++)
{
ADCSRA |= (1<<ADSC); // eine Wandlung "single conversion"
while ( ADCSRA & (1<<ADSC) ); // auf Abschluss der Konvertierung warten
Tasteradc += ADCW; // Wandlungsergebnisse aufaddieren
}
ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
Tasteradc /= 4; // Summe durch vier teilen = arithm. Mittelwert
return Tasteradc;
}
int main (void)
{
char c;
unsigned int taste = 0;
UART_init(); // UART-Init Funktion ausfhren
UART_transmit_string("Hurra, es funktioniert!!!");
while(1){
while(taste == 0) {
taste = Tastenabfrage();
}
if((taste > 350)&&(taste<375)) {
UART_transmit_string("350 - 375 ");
taste = 0;
}
if((taste > 374)&&(taste<400)) {
UART_transmit_string("374 - 400 ");
taste = 0;
}
if((taste > 399)&&(taste<425)) {
UART_transmit_string("399 - 425 ");
taste = 0;
}
if((taste > 424)&&(taste<450)) {
UART_transmit_string("424 - 450 ");
taste = 0;
}
if((taste > 449)&&(taste<475)) {
UART_transmit_string("449 - 475 ");
taste = 0;
}
if((taste > 474)&&(taste<500)) {
UART_transmit_string("474 - 500 ");
taste = 0;
}
if((taste > 499)&&(taste<525)) {
UART_transmit_string("499 - 525 ");
taste = 0;
}
if((taste > 524)&&(taste<550)) {
UART_transmit_string("524 - 550 ");
taste = 0;
}
if((taste > 3000)&&(taste<4000)) {
UART_transmit_string("300 - 400 ");
taste = 0;
}
if((taste > 4000)&&(taste<5000)) {
UART_transmit_string("400 - 500");
taste = 0;
}
if((taste > 500)&&(taste<1000)) {
//UART_transmit_string("Nix gedruckt ");
taste = 0;
}
}
}
Vielen Dank im voraus
LG
Thomas