Forum: Mikrocontroller und Digitale Elektronik ATmega32 Hilfestellung bei Programm gesucht


von Ben L. (m0b0t1x)


Angehängte Dateien:

Lesenswert?

Hallo,

ich brauche eure Hilfe bei einem Programm für den ATmega32.
Ich habe einen Ablaufplan erstellt damit es verständlicher ist (siehe 
Anhang).

Das Programm wie es unten steht funktioniert soweit, nur komm ich jetzt 
nicht weiter mit meinem Latein und es entspricht noch nicht meinen 
Vorstellungen aus dem Ablaufplan, und deshalb brauch ich nun euer Wissen 
:)

Problem:

Lichtschranke 1 startet den Timer, nur ist dieser > 3 Sekunden kommt 
kein Abbruch zustande und es wird auch kein "Err" ausgegeben. Erst wenn 
Lichtschranke 2 ein Signal sendet erscheint die Fehlermeldung.
Ich habe diverse Möglichkeiten ausprobiert und die "Abbruchmarke" 
verschoben. Aber ich komme auf keinen grünen Zweig.

Ich hoffe ihr könnt mir dabei helfen die kleinen Änderungen und 
Berichtigungen vorzunehmen.


Mfg, Ben

1
// Port A: PA0..PA3 BCD Einer
2
// Port A: PA4..PA7 BCD Zehner
3
// Port C: PC4..PC7 BCD Hunderter
4
// Port D: PD2 Start-LS, PD3 Stopp-LS
5
6
#include <avr/io.h>                       // Deklarationen
7
#include <avr/interrupt.h>                // für Interrupt
8
#define TAKT 15872000                     // 15.872 MHz: 256 = 62000:62 = 1000 Hz = 1 ms
9
unsigned int volatile sek=0, msek=0;                  // globale Word-Variable
10
unsigned char volatile izaehl=1, fehl=0;              // globale Byte-Variable
11
float m_Strecke_d=99;                                 // MESSSTRCKE IN CM
12
ISR (TIMER0_OVF_vect)                                 // Timer0 Überlauf
13
{
14
  izaehl++;if(izaehl > 62)                            // Interruptzähler
15
16
  {
17
    izaehl = 1; msek++;  
18
    if(msek >= 1000) { msek=0; sek++; }              // Zähler erhöhen
19
    if(sek >= 3) fehl = 1;                           // Überlauf-Fehlermarke setzen
20
  }
21
}
22
23
void main(void)
24
{
25
  unsigned char auskmhh, auskmhl;
26
  unsigned int time=0;
27
  int kmh;
28
  DDRA = 0xff;                      // Port A sind Ausgänge
29
  DDRC = 0xf0;                      // Port C PD4..PD7 sind Ausgänge
30
  TIMSK |= 1 << TOIE0;              // Timer0 Interrupt frei
31
  TCNT0 = 0;                        // Timer0 löschen
32
  PORTC = 0b00110000;               // Anzeige "---"
33
  PORTA = 0b00110011;
34
  while (PIND & (1 << PIND2));      // warte auf erste fallende Flanke PD2
35
  while (1)                         // Arbeitsschleife
36
  {
37
    TCCR0 = 1 << CS00; sei();                      // Timer0 start Teiler=1 Interrupt frei
38
    PORTA = 0b00000000; PORTC = 0b00000000;        // Anzeige "   " während der Messung  
39
    while(PIND & (1 << PIND3));                    // wartet auf fallende Flanke PD3
40
    TCCR0 = 0; cli();                              // Timer0 stopp Interrupt sperren
41
    time = (sek*1000) + (msek);                    // Berechnung der Zeit in ms
42
    kmh= (m_Strecke_d/time)*360;                   // Berechnung der Geschwindigkeit
43
    auskmhh = ((kmh/100) << 4) ;                   // KM/H Hunderter in BCD
44
    auskmhl = (((kmh%100)/10)<<4) | (kmh%10);      // KM/H Zehner und Einer in BCD
45
    TCNT0 = 0; izaehl = 1; msek = 0; sek = 0;
46
    while (PIND & (1 << PIND2))                    // warte auf fallende Flanke
47
    {
48
      if (fehl ==1) { PORTA = 0b01000100; PORTC = 0b01010000;}  // Fehlermarke "E r r"
49
      if (fehl ==0) 
50
        { 
51
          if (kmh>=255)
52
            {
53
              PORTC=0b01010000;
54
              PORTA=0b01000100;
55
            }
56
          if (kmh>=100)
57
            {
58
              PORTC=~auskmhh;
59
              PORTA=~auskmhl;
60
            }
61
          if (kmh<=99)
62
            {
63
              PORTC = 0b00000000;
64
              PORTA = ~auskmhl;
65
            }
66
        }
67
    }                // Ende while wartet auf fallende Flanke
68
    fehl = 0;
69
  }                  // Ende while Arbeitsschleife
70
}                    // Ende main

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.