LarsE
24.04.2008, 21:37
Hallo,
ich habe kürzlich angefangen zu programmieren, derzeit auf dem Pollinboard mit einem ATMEGA16, WINAVR und PonyProg.
Einige kleine Sachen habe ich schon zum laufen bekommen, andere leider noch nicht. Ich habe mir aus dem RN_Wissenbereich die Codes für die Tasterabfrage (https://www.roboternetz.de/wissen/index.php/Taster-Abfrage_in_C) geladen um damit 3 Taster abzufragen, die an 5 LEDs die Zustände ausgeben. Dazu habe ich folgenden Code geschrieben, bei dem ich beim *.hex-file generieren immer Probleme habe, dass die Funktion get_taster und tasten keine Referenzen hat. Könnte sich vielleciht mal jemand mit dem Code auseinandersetzten und mir Nachhilfe geben?
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#ifndef F_CPU
#define F_CPU 16000000 /*Quarz 16 Mhz*/
#endif
#include "taster.h" /*Routine zum Taster entprellen*/
/*Taster #0--> PortA.0
* #1--> PortA.1
* #2--> Porta.2
*/
//void get_taster (const unsigned char num, unsigned char tast)
SIGNAL (SIG_OVERFLOW0)
{
static unsigned char count_ov10;
unsigned char ov10 = count_ov10+1;
if (ov10 >= 39)
{
get_taster (0, PINA & (1<<PA0));
get_taster (1, PINA & (1<<PA1));
get_taster (2, PINA & (1<<PA2));
ov10 = 0;
}
count_ov10 = ov10;
}
void ioinit(void)
{
PORTA |=(1 << PA0); /*PUllUp Taster0*/
PORTA |=(1 << PA1); /*PullUp Taster1*/
PORTA |=(1 << PA2); /*PullUp Taster2*/
TCCR0 = 1 << CS00; /*Timer ohne Prescaler starten*/
TIMSK |= (1 << TOIE0); /*Timer=-Overflow-Interrupt aktivieren*/
}
int main(void)
{
DDRA &= ~(1 << PA0);
DDRA &= ~(1 << PA1);
DDRA &= ~(1 << PA2);
DDRB |= (1 << PB0);
DDRB |= (1 << PB1);
DDRB |= (1 << PB2);
DDRB |= (1 << PB3);
DDRB |= (1 << PB4);
ioinit();
tasten[0].mode = TM_SHORT; /*Tastenmodus konfigurieren*/
tasten[1].mode = TM_LONG; /*TM_SHORT=kurz; TM_LONG=kurz+lang*/
tasten[2].mode = TM_LONG;
sei(); /*Interrupts global aktivieren*/
while(1) /*Hauptschleife*/
{
signed char tast = taster;
switch (tast)
{
default:
case NO_TASTER: /*kein Taster*/
break;
case 0: /*Taster 0*/
PORTB |= (1 << PB0);
case 1: /*Taster 1 kurz*/
PORTB |= (1 << PB1);
case 1+TASTER_LONG: /*Taster 1 lang*/
PORTB |= (1 << PB2);
case 2: /*Taster 2 kurz*/
PORTB |= (1 << PB3);
case 2+TASTER_LONG: /*Taster 2 lang*/
PORTB |= (1 << PB4);
}
if (tast != NO_TASTER)
taster = NO_TASTER;
}
return(0);
}
Vielen Dank im Vorraus.
Gruß Lars
ich habe kürzlich angefangen zu programmieren, derzeit auf dem Pollinboard mit einem ATMEGA16, WINAVR und PonyProg.
Einige kleine Sachen habe ich schon zum laufen bekommen, andere leider noch nicht. Ich habe mir aus dem RN_Wissenbereich die Codes für die Tasterabfrage (https://www.roboternetz.de/wissen/index.php/Taster-Abfrage_in_C) geladen um damit 3 Taster abzufragen, die an 5 LEDs die Zustände ausgeben. Dazu habe ich folgenden Code geschrieben, bei dem ich beim *.hex-file generieren immer Probleme habe, dass die Funktion get_taster und tasten keine Referenzen hat. Könnte sich vielleciht mal jemand mit dem Code auseinandersetzten und mir Nachhilfe geben?
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>
#ifndef F_CPU
#define F_CPU 16000000 /*Quarz 16 Mhz*/
#endif
#include "taster.h" /*Routine zum Taster entprellen*/
/*Taster #0--> PortA.0
* #1--> PortA.1
* #2--> Porta.2
*/
//void get_taster (const unsigned char num, unsigned char tast)
SIGNAL (SIG_OVERFLOW0)
{
static unsigned char count_ov10;
unsigned char ov10 = count_ov10+1;
if (ov10 >= 39)
{
get_taster (0, PINA & (1<<PA0));
get_taster (1, PINA & (1<<PA1));
get_taster (2, PINA & (1<<PA2));
ov10 = 0;
}
count_ov10 = ov10;
}
void ioinit(void)
{
PORTA |=(1 << PA0); /*PUllUp Taster0*/
PORTA |=(1 << PA1); /*PullUp Taster1*/
PORTA |=(1 << PA2); /*PullUp Taster2*/
TCCR0 = 1 << CS00; /*Timer ohne Prescaler starten*/
TIMSK |= (1 << TOIE0); /*Timer=-Overflow-Interrupt aktivieren*/
}
int main(void)
{
DDRA &= ~(1 << PA0);
DDRA &= ~(1 << PA1);
DDRA &= ~(1 << PA2);
DDRB |= (1 << PB0);
DDRB |= (1 << PB1);
DDRB |= (1 << PB2);
DDRB |= (1 << PB3);
DDRB |= (1 << PB4);
ioinit();
tasten[0].mode = TM_SHORT; /*Tastenmodus konfigurieren*/
tasten[1].mode = TM_LONG; /*TM_SHORT=kurz; TM_LONG=kurz+lang*/
tasten[2].mode = TM_LONG;
sei(); /*Interrupts global aktivieren*/
while(1) /*Hauptschleife*/
{
signed char tast = taster;
switch (tast)
{
default:
case NO_TASTER: /*kein Taster*/
break;
case 0: /*Taster 0*/
PORTB |= (1 << PB0);
case 1: /*Taster 1 kurz*/
PORTB |= (1 << PB1);
case 1+TASTER_LONG: /*Taster 1 lang*/
PORTB |= (1 << PB2);
case 2: /*Taster 2 kurz*/
PORTB |= (1 << PB3);
case 2+TASTER_LONG: /*Taster 2 lang*/
PORTB |= (1 << PB4);
}
if (tast != NO_TASTER)
taster = NO_TASTER;
}
return(0);
}
Vielen Dank im Vorraus.
Gruß Lars