Forum: Mikrocontroller und Digitale Elektronik frequenz auslesen und auf lcd anzeigen


von Tobias (Gast)


Lesenswert?

Hallo,
ich möchte bei meinem selbstgebauten funktionsgenerator die freuenz 
auslesen und auf ein display ausgeben. die frequenz lässt sich von 
5Hz-15kHz einstellen. ich möchte mit dem timer0 eine torzeit von 200ms 
abfragen welche wie viele positive flanken timer1 gezählt hat.

leider funktioniert es noch nicht so. feste variablen lassen sich im 
display anzeigen. jedoch funktionieren die interrupts noch nicht so. 
sobald ich die interrupts mit "sei();" antivieren möchte, schreibt er 
nichts mehr ins display.

das ist mein code bis jetzt:

cdatei:
1
#define F_CPU 4000000UL
2
3
#include <avr/io.h> 
4
#include <stdlib.h> //Standardlib
5
#include <stdio.h>  //für sprintf
6
#include <avr/interrupt.h> //für interrupt
7
#include <avr/delay.h>  //Zeitschleife
8
#include "lcd.h"
9
10
int main (void) {            
11
 
12
  DDRA  = 0xff; //Ausgänge             
13
  DDRB  = 0x00; //Eingänge
14
  DDRC  = 0xff;
15
  DDRD  = 0xff;
16
17
//init LCD
18
  
19
  RS_0;
20
  PORTA=0b00111000; //8bit, 2zeilig, 5x7
21
  E();
22
  wait();
23
  PORTA=0b00001100; //Display ein
24
     E();
25
  wait();
26
27
//Timer0 config
28
  TCCR0=0b00000100; //Prescaler256
29
  TIMSK |=(1<<TOIE0); //Overflow Interrupt erlauben
30
31
//Timer1 config
32
  TCCR1B=0b00000111; //increment bei rising edge
33
  sei(); //global Interrupts aktivieren
34
35
//Ausgabe
36
37
  while(1) //Endlosschleife
38
  {
39
  _delay_ms(500);
40
  hz=10000;
41
  sprintf(buffertakt, "%02dHz", hz);
42
  ausgabe();
43
  }
44
   
45
   return 0;
46
}
47
48
//Zählerinterrupt Timer0
49
ISR (TIMER0_OVF_vect)
50
{
51
zaehler++;
52
  if (zaehler == 12)//ale 200ms min 5Hz
53
  {
54
  hz=TCNT1L;
55
  zaehler=0;
56
  }
57
//}

hdatei:
1
char buffertakt [50];
2
int zaehler;
3
int zahl;
4
int hz;
5
int i;
6
7
#define RS_1    PORTC |= (1<<PC7)
8
#define RS_0    PORTC &= ~(1<<PC7)
9
10
int wait ()
11
{
12
_delay_ms(2);
13
return 0;
14
}
15
16
int E ()
17
{
18
PORTC |= (1<<PC6);
19
PORTC &= ~(1<<PC6);
20
return 0;
21
}
22
23
int ausgabe ()
24
{
25
RS_0;
26
PORTA=0b10000000; //Cursorpoisition
27
E();
28
wait();
29
zahl=0;
30
  for(i=0; i<=6; i++)
31
  {
32
  RS_1;
33
  PORTA=buffertakt [zahl++];
34
  E();
35
  wait();
36
  }
37
return 0;
38
}

von Karl H. (kbuchegg)


Lesenswert?

Wieso ist hier
1
ISR (TIMER0_OVF_vect)
2
{
3
zaehler++;
4
  if (zaehler == 12)//ale 200ms min 5Hz
5
  {
6
  hz=TCNT1L;
7
  zaehler=0;
8
  }
9
//}

die letzte } auskommentiert?

Du musst unbedingt dein Einrückschema verbessern. Im Moment sieht man 
bei dir nur sehr schwer, wo eine { anfängt bzw. wo die korrespondierende 
} ist.

Meiner Zählung nach müsste die auskommentierte } eigentlich nicht 
auskommentiert sein.

von Karl H. (kbuchegg)


Lesenswert?

Und tu dir selbst einen Gefallen und schaff dir erst mal eine 
unabhängige Software-Ebene, in der du die LCD Funktionen ansiedelst. Das 
hat keinen wirklichen Sinn, wenn du die Portzugriffe da mitten in deinen 
Applikationscode einbaust.
Da sieht man ja den Wald vor lauter Bäumen nicht mehr.

Ein Minialsatz an Funktionen wäre zb

lcd_init()
lcd_gotoxy( uint8_t line, uint8_t column )
lcd_char( char c )
lcd_string( const char* str )

von Karl H. (kbuchegg)


Lesenswert?

> jedoch funktionieren die interrupts noch nicht so.
> sobald ich die interrupts mit "sei();" antivieren möchte, schreibt
> er nichts mehr ins display.

Sowas ist normalerweise ein starker Hinweis darauf, dass du irgendwo 
einen Interrupt freigegeben hast, für den du keine ISR hast.

Hast du hier
1
ISR (TIMER0_OVF_vect)
2
{
3
  ...

vom Compiler irgendwelche Warnungen bekommen?

von Tobias (Gast)


Lesenswert?

ohh das auskommentiere habe ich versehendlich mitkopiert. das habe ich 
schon geändert. ja das stimmt der code ist noch nicht sehr schön. aber 
ich möchte ja erstmal das es funktioniert. das display zeit ja das 
richtige an, wenn ich was von hand in die variablen schreibe. die 
interrupts funktionieren nur nicht. es kommen auch 3 warnungen:

../funktionsgenerator.c:48: warning: return type defaults to `int'
../funktionsgenerator.c: In function `ISR':
../funktionsgenerator.c:48: warning: type of "TIMER0_OVF_vect" defaults 
to "int"
../funktionsgenerator.c:55: warning: control reaches end of non-void 
function

was bedeuten die?

von Karl H. (kbuchegg)


Lesenswert?

Tobias schrieb:
> ohh das auskommentiere habe ich versehendlich mitkopiert. das habe ich
> schon geändert. ja das stimmt der code ist noch nicht sehr schön. aber
> ich möchte ja erstmal das es funktioniert.

Das ist ein Irrtum.
Du rennst Fehlern nach, die nicht sein müssen. UNd alles nur deswegen, 
weil du sie selber nicht siehst.

Ausserdem erlaubt dir ein vernünftiger Satz an LCD Funktionen problemlos 
und ohne großen Aufwand, dir Testausgaben ins Programm einzubauen, so 
dass du selber leicht nachvollziehen kannst, was da passiert.

> ../funktionsgenerator.c:48: warning: return type defaults to `int'
> ../funktionsgenerator.c: In function `ISR':
> ../funktionsgenerator.c:48: warning: type of "TIMER0_OVF_vect" defaults
> to "int"
> ../funktionsgenerator.c:55: warning: control reaches end of non-void
> function
>
> was bedeuten die?

Das die Interrupt Funktion auf deinem µC anders heißt.

von Karl H. (kbuchegg)


Lesenswert?

Karl Heinz Buchegger schrieb:

>> ../funktionsgenerator.c:48: warning: return type defaults to `int'
>> ../funktionsgenerator.c: In function `ISR':
>> ../funktionsgenerator.c:48: warning: type of "TIMER0_OVF_vect" defaults
>> to "int"
>> ../funktionsgenerator.c:55: warning: control reaches end of non-void
>> function
>>
>> was bedeuten die?
>
> Das die Interrupt Funktion auf deinem µC anders heißt.

Nein. Warte mal. Dann wäre der Text der Warnung ein anderer.

Bist du sicher, dass du
1
#include <avr/interrupt.h> //für interrupt

in dem Code drinnen hast, den du compilierst.

Mit sowas:
> ohh das auskommentiere habe ich versehendlich mitkopiert.
haben wir hier gar keine Freude.
Hänge das C-File an, so wie du es compilierst und kopiere nichts extra 
fürs Forum. Denn dann suchen wir Fehler, die in deinem richtigen Code 
nicht vorhanden sind.

von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

ja das habe ich nicht auskommentiert...

von Karl H. (kbuchegg)


Lesenswert?

Und wenn du jetzt noch verraten würdest um welchen µC es sich handelt, 
dann könnte man den hier sogar im AVR-Studio mal einstellen und 
nachsehen
* welche Warnungen sonst noch ignoriert wurden
* wie der ISR Handler wirklich heißen muss

Dass man den Leuten immer alles aus der Nase ziehen muss :-)

von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

tut mir leid :) ich verwende einen atmega 16 ;)
ich habe mal meinen frequenzgenerator als bild angehängt...

von Tobias (Gast)


Lesenswert?

sobald ich die interrupts aktiviere geht es nicht mehr :/
ich hab jetzt auch mehrfach im avr tutorial nachgeschaut aber ich finde 
den fehler nicht...

von J.-u. G. (juwe)


Lesenswert?

Mal davon abgesehen, dass Deine Funktionsdefinitionen nicht nach lcd.h 
gehören, müssen Deine Variablen, die Du sowohl in der ISR, als auch in 
anderen Funktionen verwendest, als "volatle" deklariert werden.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Datenaustausch_mit_Interrupt-Routinen

von Tobias (Gast)


Lesenswert?

daran lags leider nicht...der interrupt geht immer noch nicht...

von Tobias (Gast)


Lesenswert?

beim interrupt habe ich folgende fehlermeldungen:

../funktionsgenerator.c:53: warning: return type defaults to `int'
../funktionsgenerator.c: In function `ISR':
../funktionsgenerator.c:53: warning: type of "TIMER2_OVF_vect" defaults 
to "int"
../funktionsgenerator.c:59: warning: control reaches end of non-void 
function

kann mir jemand sagen, was ich da falsch gemacht habe?

von J.-u. G. (juwe)


Lesenswert?

Tobias schrieb:
> kann mir jemand sagen, was ich da falsch gemacht habe?

> ISR (TIMER0_OVF_vect)

Zwischen "ISR" und "(" gehört kein Leerzeichen.

von Marco (Gast)


Lesenswert?

ne das war es leider auch nicht. das komische ist eben, dass so alles 
prima funktioniert aber sobald ich mit sei(); die interrupts aktiviere 
geht gar nichts mehr :/

von J.-u. G. (juwe)


Lesenswert?

Marco schrieb:
> ne das war es leider auch nicht.

Sind die Warnmeldungen, die Du oben gezeigt hast, jetzt weg oder nicht? 
Gibt es noch weitere Compilermelduneg?

von Tobias (Gast)


Lesenswert?

ne die sind leider noch nicht weg...
das sind alle:

Build started 9.4.2013 at 21:01:17
avr-gcc  -mmcu=atmega16 -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -MD -MP -MT funktionsgenerator.o -MF 
dep/funktionsgenerator.o.d  -c  ../funktionsgenerator.c
../funktionsgenerator.c:52: warning: return type defaults to `int'
../funktionsgenerator.c: In function `ISR':
../funktionsgenerator.c:52: warning: type of "TIMER2_OVF_vect" defaults 
to "int"
../funktionsgenerator.c:60: warning: control reaches end of non-void 
function
avr-gcc -mmcu=atmega16 -Wl,-Map=funktionsgenerator.map 
funktionsgenerator.o     -o funktionsgenerator.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature 
funktionsgenerator.elf funktionsgenerator.hex
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" 
--change-section-lma .eeprom=0 --no-change-warnings -O ihex 
funktionsgenerator.elf funktionsgenerator.eep || exit 0
/usr/bin/sh: /c/WinAVR/bin/avr-objcopy: Invalid argument
avr-objdump -h -S funktionsgenerator.elf > funktionsgenerator.lss
/usr/bin/sh: /c/WinAVR/bin/avr-objdump: Invalid argument
make: *** [funktionsgenerator.lss] Error 126
Build failed with 1 errors and 3 warnings...

von J.-u. G. (juwe)


Lesenswert?

Tobias schrieb:
> ../funktionsgenerator.c:52: warning: type of "TIMER2_OVF_vect" defaults

"TIMER2_OVF_vect"? Wo kommt denn das nun wieder her. Entschuldige bitte, 
aber langsam wird es mir zu blöd. Zeige hier bitte exakt den Code, der 
bei Dir Probleme macht.

von Tobias (Gast)


Angehängte Dateien:

Lesenswert?

ich hatte mir ein beispiel mit dem timer2 kopiert und wollte es damit 
probieren. damit geht es aber auch leider nicht...
ich habe die aktuellen files mit der eben genannten fehlermeldung 
beigefügt...

von J.-u. G. (juwe)


Lesenswert?

Im Funktionskopf einer C-Funktion darf zwischen Funktionsname und 
Parameterliste kein Leerzeichen stehen. Das hast Du bei allen Deinen 
Funktionen ,inklusive "main", nicht beachtet.

Außerdem hast Du Deine main-Funktion mit Rückgabewert "int" deklariert, 
sie enthält aber kein "return" Statement.

von Tobias (Gast)


Lesenswert?

okay ich habe es korrigiert. aber das war der fehler leider auch nicht. 
die warnungen werden immernoch angezeigt...

von J.-u. G. (juwe)


Lesenswert?

Tobias schrieb:
> aber das war der fehler leider auch nicht.
> die warnungen werden immernoch angezeigt...

Ich habe jetzt mal Deine beiden Datein in ein AVR4-Studio-Projekt 
eingefügt. Es kompilierte mit nur einer Warnmeldung, die besagt, dass 
die Headerdatei delay.h nun unter utils/delay.h zu finden ist. Nach 
Änderung dieser Zeile kompilierte das Projekt ohen Fehler- und 
Warnmeldungen.

von Tobias (Gast)


Lesenswert?

ich glaube es liegt an meiner compilerversion...das war anfangs schon so 
komisch weil der den nicht von alleine gefunden hat. das delay musste 
ich extra ändern, da ich noch die alte version habe. ich lade gerade den 
neuen herunter...

von Tobias (Gast)


Lesenswert?

das ist der hammer ich hing ein ganzen tag rum jetzt wegen dem mist und 
nur weil meine comlierversion veraltet war :/ jetzt geht alles...aber 
danke für deine bemühungen :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.