frequenz auslesen und auf lcd anzeigen

Gast #3121743
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
}
#3121748
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.
#3121751
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 )
#3121754
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?
Gast #3121760
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?
#3121768
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.
#3121774
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.
#3121796
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 :-)
Gast #3121969
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?
Gast #3122036
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...
#3122059
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.
#3122091
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.
Gast #3122113
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren