Forum: Compiler & IDEs AVR Zeit zwischen 2 Eingangssignalen messen


von Henning U. (henning_u)


Lesenswert?

Hallo,
ich verwende einen ATmega32 und versuche zur Zeit mir eine Differenz 
zwischen zwei Tastersignalen auf einem LCD ausgeben zu lassen, sobald 
ein dritter Taster gedrückt wurde. Die Taster sind von PA4 bis PA6 
angeschlossen.
Ich habe mir verschiedene ähnliche Projekte angesehen doch der 
Beispielcode dort hat mir kaum weiter geholfen.

Hier mein Code:
1
 
2
#define F_CPU 16000000
3
4
#include <avr/io.h>
5
#include <stdlib.h>
6
#include <avr/interrupt.h>
7
#include "lcd.h"
8
9
int taster;
10
11
int overflow = 0;
12
13
14
int mess1;
15
int mess2;
16
int ergebnis;
17
18
char Buffer[20];
19
20
ISR (TIMER0_OVF_vect)
21
{
22
  overflow++;
23
}
24
25
int main(void)
26
{
27
  DDRA=0xff;
28
  
29
  // Timer 0 konfigurieren
30
  TCCR0 |= (1<<CS02) |(1<<CS00);  // Prescaler 1024
31
  
32
  // Overflow Interrupt erlauben
33
  TIMSK |= (1<<TOIE0);
34
  
35
  // Global Interrupts aktivieren
36
  sei();
37
  
38
  while(1)
39
  {
40
    taster = PINA & 0xf0;
41
    
42
    if (taster==16)
43
    {
44
      mess1=overflow;
45
    }
46
    
47
    if (taster==32)
48
    {
49
      mess2=overflow;
50
    }
51
    
52
    if (taster==64)
53
    {
54
      ergebnis=(mess2-mess1);
55
      lcd_init();
56
      itoa( ergebnis , Buffer, 10 );
57
      lcd_string( Buffer );
58
      
59
    }
60
  }
61
}

: Verschoben durch User
von Flip B. (frickelfreak)


Lesenswert?

Du musst overflow immer am anfang der while schleife zurücksetzen auf 0

Flip

von Henning U. (henning_u)


Lesenswert?

Danke für den Tipp.
Hab allerdings immer noch das selbe Ergebnis. Das LCD zeigt nur 0 an.

von Axel S. (a-za-z0-9)


Lesenswert?

Henning U. schrieb:

> Hab allerdings immer noch das selbe Ergebnis. Das LCD zeigt nur 0 an.

Du hast volatile nicht verstanden

von Henning U. (henning_u)


Lesenswert?

Habe mir jetzt die Erklärung zu volatile angesehen und die Variable 
overflow als volatile deklariert.
Display zeigt aber immer noch 0 an

von Henning U. (henning_u)


Lesenswert?

Hab noch ein wenig rumprobiert und jetzt klappts :-)
Danke für die Hilfe

von Willi L (Gast)


Lesenswert?

Henning U. schrieb:
> Hab noch ein wenig rumprobiert und jetzt klappts :-)

Hallo,

kannst du uns bitte sagen woran es lag
LG
Willi

von Karl H. (kbuchegg)


Lesenswert?

Willi L schrieb:
> Henning U. schrieb:
>> Hab noch ein wenig rumprobiert und jetzt klappts :-)
>
> Hallo,
>
> kannst du uns bitte sagen woran es lag

Zum Beispiel daran
1
  DDRA=0xff;
2
3
...
4
    taster = PINA & 0xf0;

wenn man vom Port A über das Pin Register den Zustand von Tasten 
einlesen will, dann ist es eher wenig zielführend, den kompletten Port 
auf Ausgang zu schalten.

volatile wurde schon angesprochen.

Das Rücksetzen von overflow hingegen ist nicht notwendig. Durch die Art 
der Berechnung wäre es egal, sofern die Datentypen der Variablen 
vernünftig gewählt wären. Einfach alles int machen ist nicht 
zielführend. Praktisch alles in seinem Programm kann zuallererst mal 
unsigned gemacht werden, was den Vorteil hätte, dass
1
      ergebnis=(mess2-mess1);
ein definiertes Verhalten hätte, wenn es in den 'Overflow' Bereich rein 
geht. Dann müsste man allerdings utoa anstelle von itoa benutzen.

'tasten', als die Variable, die den Portinhalt aufnimmt, sollte 
zusätzlich noch als 8 Bit Variable ausgeführt werden und nicht als int.

Sowas
1
    if (taster==16)
ist nicht wirklich schön und/oder vernünftig.


Fazit: Jemand, der seine Grundübungen im Umgang mit Portpins gemacht hat 
und Ein/Ausgabe auf diesem Level beherrscht (durch Spielerein mit LED 
und Tastern), sollte keine Probleme haben, all die kleinen Fehler zu 
finden und zu korrieren, die dem TO das Leben schwer gemacht haben, 
indem er die ersten Schritte in der AVR Programmierung übersprungen hat.

: Bearbeitet durch User
von Henning U. (henning_u)


Lesenswert?

Ja das waren die Probleme.
Grundlagen haben wir in der Schule gemacht und leider nur mit integer 
Variablen gearbeitet. Ich werde mir die Artikel zu den Datentypen und 
zur Bitmaskieruung noch einmal angucken.
Danke für die Hilfe
Henning

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.