Funktion wird nicht richtig beendet
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
Code:
#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;
}
/*+++++++++++++++++++++++++++++++++++++WARTEFUNKTION+++++++++++++++++++++++++++*/
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 */
}
/*+++++++++++++++++++++++++++++++++++++HAUPTPROGRAMM+++++++++++++++++++++++++++*/
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
Ebensfalls Problem beim Rücksprung aus Unterprogramm
Moin moin zusammen,
im Studium wurde ich kürzlichst mit der uC-Programmierung konfrontriert und habe glatt so viel gefallen daran gefunden, dass ich mir einen RP6 zugelegt habe.
In anhlehnung an mein Studium, wo ich den Infineon XC161 kennenlernte, möchte ich den RP6 nun von Grund auf neu programmieren.
Hier kurz die Rahmendaten:
- RP6 mit ATMEGA32L + RP6-Control mit ATMEGA32
- nutze AVR Studio 4
- und mitgelieferte GCC
Die ersten Schritte waren bisher mühsam aber gelangen. Wobei mir noch immer nicht so ganz klar ist, wie ich bei einem neuen Projekt für diese Prozessoren die Speichereinstellungen vornehmen muss?
Im weiteren habe ich bisher ein einfaches Init-Unterprogramm geschrieben, mit dem ich die auf dem RP6 vorhandenen LEDs initialisiere. Aus diesem Unterprogramm kommt der Programmablauf auch korrekt zurück.
Arbeite ich - wofür auch immer / hier z.B. um gezielt einzelne LEDs zu schalten - mit einem weiteren Unterprogramm, bleibt der Programmablauf sowohl in der Simulation, als auch in der Hardware am Ende des Unterprogramms stehen. Steppe ich durch die Simulation, schaltet der Simulator dann an der Stelle wo ich den Rücksprung in die Main erwarte auf Running.
Ein weiteres Problem, was ich gerne ansprechen möchte ist folgendes:
Wieso kann ich ausser in der MAIN keine lokalen Variablen anlegen? Hierbei kommt es dann bereits zu einem Fehler beim Übersetzen. Hängt das mit der womöglich noch nicht korrekt angelegten "Speicherverwaltung" in den Einstellungen des Projektes zusammen?
Schonmal vorab vielen Dank für die Hilfe und zum passenden Zeitpunkt einen guten Rutsch heute abend!
MfG,
Oppi