kowolfgang
28.09.2007, 17:38
Hallo,
ich soll für einen guten bekannten eine Geschwindigkeitsanzeige entwickeln die ihm die Geschwindigkeit seiner Modelle auf einer 4stelligen Dot-Matrix Anzeige in Wirklichkeit anzeigt. Ich hatte schoneinmal ein Programm dafür in Bascom angefangen, allerdings geht mir Bascom inzwischen ziemlich auf die Nerven weil der Compiler ein paar ziemliche Bugs bei den neueren Tinys hat, die einen immer ewig nach den Ursachen für die Fehler suchen lassen. Dies hier ist also mein erstes wirkliches Projekt in C deswegen bin ich in dieser Sprache noch nicht so bewandert. Als Display hab ich mir das SLR2016 vom Conrad ausgesucht weil es sich mit relativ wenigen Leitungen ansteuern lässt und weil es schön klein ist, zudem leuchten die Zahlen ordentlich hell.
Gesteuert wird das ganze mit einem ATtiny44, die Anzeige hat auch schon funktioniert (allerdings mit einem Programm das ich früher in Bascom geschrieben hab).
Das Problem in meinem Programm ist jetzt aber das das Programm nach beendigung meiner selbstgestrickten Wait Funktion nicht mehr ins Hauptprogramm sondern in die Interrupt Routine vom Timer0 springt (wird für die Waitfunktion verwendet).Hier Poste ich mal den Code damit ihr seht was das Programm die ganze Zeit so treibt
#include <avr/io.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#ifndef F_CPU
#define F_CPU 8000000UL /* Interner Oszillator mit 8Mhz */
#endif
/* Variablen definieren */
uint8_t Statusbyte = 0; /* Statusbyte für verschiedene Operationen */
volatile uint16_t Waittime = 0; /* Countvariable für Waitfunktion */
volatile uint16_t Waitcount = 0; /* Countvariable für Waitfunktion */
/* Variablen für Geschwindigkeitsmessung */
volatile uint8_t overflowcount = 0; /* Zähler für Timer Overflows */
uint16_t timer1counts = 0; /*Zählerstand von Timer1 */
float zeit = 0.0; /* Gemessene Timer1 Zeit */
float ov_summ_zeit = 0.0;
float v_float = 0.0; /* Geschwindigkeit mit Kommastelle*/
uint16_t V = 0; /* Geschwindigkeit ohne Kommastelle */
/* Variablen für Displayanzeige */
char Display[5];
/* Konstanten */
const float H0_10cm = 31.32;
const float N_10cm = 115.2;
const float overflowzeit = 2.097152;
const uint16_t cps = 31250;
const uint8_t disp_char0 = 0x00;
const uint8_t disp_char1 = 0x10;
const uint8_t disp_char2 = 0x20;
const uint8_t disp_char3 = 0x30;
/* Konstanten für Displaychars */
const uint8_t wertetabelle[] PROGMEM = {0x00 , 0x08 , 0x04 , 0x0C , 0x02 , 0x0A , 0x06 , 0x0E , 0x01 , 0x09 , 0x05 , 0x0D , 0x03 , 0x0B , 0x07 , 0x0F };
/* ++++++++++++++++++++++++++++++++++++INTERRUPTS++++ ++++++++++++++++++++++++++*/
ISR(TIM0_OVF_vect)
{ Waitcount ++;
}
ISR(TIM1_OVF_vect)
{ overflowcount ++;
}
/* Prototypen */
void init_io();
void timer_init();
void wait(uint16_t zeit, uint8_t faktor);
/* ++++++++++++++++++++++++++++++++++++FUNKTIONEN++++ ++++++++++++++++++++++++++*/
/* IOs initialisieren */
void init_io()
{
DDRA |= 0xff;
PORTA |= 0xC0;
DDRB |= 0x0C;
PORTB |= 0x07;
#define disp_blank PA7
#define disp_write PA6
#define disp_clear PB2
return;
}
/* Timer initialisieren und Interrupts einrichten*/
void timer_init() /* Timer1 wird initialisiert aber nicht gestartet */
{
/* Timer0 */
TCCR0A = 0;
TCCR0B = 0;
TIMSK0 = (1<<TOIE0);
/* Timer1 */
/*TCNT1L = 0;
TCNT1H = 0;*/
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = (1<<TOIE1);
return;
}
/*+++++++++++++++++++++++++++++++++++++WARTEFUNKTIO N+++++++++++++++++++++++++++*/
void wait(uint16_t zeit, uint8_t faktor)
{
const float CPMS = 31.25; /* Counts pro Milisekunde */
Waitcount = 0;
Waittime = (zeit * faktor)*CPMS;
TCNT0 = 0;
sei();
TCCR0B = (1 <<CS00);
while (Waitcount < Waittime)
{
};
TCCR0B |= (1<< CS00);
cli();
return; /* <<<<<<<Da Hängt er sich auf */
}
/*+++++++++++++++++++++++++++++++++++++HAUPTPROGRAM M+++++++++++++++++++++++++++*/
int main(void)
{
init_io();
timer_init();
wait(1, 1);
V = messung();
Anzeige(15,2);
return 0;
}
ich hoffe ihr könnt mir helfen damit mein erstes C Programm nicht gleich ein Desaster wird
Gruß und Dank im Vorraus
Wolfgang
ich soll für einen guten bekannten eine Geschwindigkeitsanzeige entwickeln die ihm die Geschwindigkeit seiner Modelle auf einer 4stelligen Dot-Matrix Anzeige in Wirklichkeit anzeigt. Ich hatte schoneinmal ein Programm dafür in Bascom angefangen, allerdings geht mir Bascom inzwischen ziemlich auf die Nerven weil der Compiler ein paar ziemliche Bugs bei den neueren Tinys hat, die einen immer ewig nach den Ursachen für die Fehler suchen lassen. Dies hier ist also mein erstes wirkliches Projekt in C deswegen bin ich in dieser Sprache noch nicht so bewandert. Als Display hab ich mir das SLR2016 vom Conrad ausgesucht weil es sich mit relativ wenigen Leitungen ansteuern lässt und weil es schön klein ist, zudem leuchten die Zahlen ordentlich hell.
Gesteuert wird das ganze mit einem ATtiny44, die Anzeige hat auch schon funktioniert (allerdings mit einem Programm das ich früher in Bascom geschrieben hab).
Das Problem in meinem Programm ist jetzt aber das das Programm nach beendigung meiner selbstgestrickten Wait Funktion nicht mehr ins Hauptprogramm sondern in die Interrupt Routine vom Timer0 springt (wird für die Waitfunktion verwendet).Hier Poste ich mal den Code damit ihr seht was das Programm die ganze Zeit so treibt
#include <avr/io.h>
#include <stdlib.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#ifndef F_CPU
#define F_CPU 8000000UL /* Interner Oszillator mit 8Mhz */
#endif
/* Variablen definieren */
uint8_t Statusbyte = 0; /* Statusbyte für verschiedene Operationen */
volatile uint16_t Waittime = 0; /* Countvariable für Waitfunktion */
volatile uint16_t Waitcount = 0; /* Countvariable für Waitfunktion */
/* Variablen für Geschwindigkeitsmessung */
volatile uint8_t overflowcount = 0; /* Zähler für Timer Overflows */
uint16_t timer1counts = 0; /*Zählerstand von Timer1 */
float zeit = 0.0; /* Gemessene Timer1 Zeit */
float ov_summ_zeit = 0.0;
float v_float = 0.0; /* Geschwindigkeit mit Kommastelle*/
uint16_t V = 0; /* Geschwindigkeit ohne Kommastelle */
/* Variablen für Displayanzeige */
char Display[5];
/* Konstanten */
const float H0_10cm = 31.32;
const float N_10cm = 115.2;
const float overflowzeit = 2.097152;
const uint16_t cps = 31250;
const uint8_t disp_char0 = 0x00;
const uint8_t disp_char1 = 0x10;
const uint8_t disp_char2 = 0x20;
const uint8_t disp_char3 = 0x30;
/* Konstanten für Displaychars */
const uint8_t wertetabelle[] PROGMEM = {0x00 , 0x08 , 0x04 , 0x0C , 0x02 , 0x0A , 0x06 , 0x0E , 0x01 , 0x09 , 0x05 , 0x0D , 0x03 , 0x0B , 0x07 , 0x0F };
/* ++++++++++++++++++++++++++++++++++++INTERRUPTS++++ ++++++++++++++++++++++++++*/
ISR(TIM0_OVF_vect)
{ Waitcount ++;
}
ISR(TIM1_OVF_vect)
{ overflowcount ++;
}
/* Prototypen */
void init_io();
void timer_init();
void wait(uint16_t zeit, uint8_t faktor);
/* ++++++++++++++++++++++++++++++++++++FUNKTIONEN++++ ++++++++++++++++++++++++++*/
/* IOs initialisieren */
void init_io()
{
DDRA |= 0xff;
PORTA |= 0xC0;
DDRB |= 0x0C;
PORTB |= 0x07;
#define disp_blank PA7
#define disp_write PA6
#define disp_clear PB2
return;
}
/* Timer initialisieren und Interrupts einrichten*/
void timer_init() /* Timer1 wird initialisiert aber nicht gestartet */
{
/* Timer0 */
TCCR0A = 0;
TCCR0B = 0;
TIMSK0 = (1<<TOIE0);
/* Timer1 */
/*TCNT1L = 0;
TCNT1H = 0;*/
TCNT1 = 0;
TCCR1A = 0;
TCCR1B = 0;
TIMSK1 = (1<<TOIE1);
return;
}
/*+++++++++++++++++++++++++++++++++++++WARTEFUNKTIO N+++++++++++++++++++++++++++*/
void wait(uint16_t zeit, uint8_t faktor)
{
const float CPMS = 31.25; /* Counts pro Milisekunde */
Waitcount = 0;
Waittime = (zeit * faktor)*CPMS;
TCNT0 = 0;
sei();
TCCR0B = (1 <<CS00);
while (Waitcount < Waittime)
{
};
TCCR0B |= (1<< CS00);
cli();
return; /* <<<<<<<Da Hängt er sich auf */
}
/*+++++++++++++++++++++++++++++++++++++HAUPTPROGRAM M+++++++++++++++++++++++++++*/
int main(void)
{
init_io();
timer_init();
wait(1, 1);
V = messung();
Anzeige(15,2);
return 0;
}
ich hoffe ihr könnt mir helfen damit mein erstes C Programm nicht gleich ein Desaster wird
Gruß und Dank im Vorraus
Wolfgang