AVR Zeit zwischen 2 Eingangssignalen messen

#3557584
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
}
#3558259
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.

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