www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega32 Hilfestellung bei Programm gesucht


Autor: Ben L. (m0b0t1x)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

// Port A: PA0..PA3 BCD Einer
// Port A: PA4..PA7 BCD Zehner
// Port C: PC4..PC7 BCD Hunderter
// Port D: PD2 Start-LS, PD3 Stopp-LS

#include <avr/io.h>                       // Deklarationen
#include <avr/interrupt.h>                // für Interrupt
#define TAKT 15872000                     // 15.872 MHz: 256 = 62000:62 = 1000 Hz = 1 ms
unsigned int volatile sek=0, msek=0;                  // globale Word-Variable
unsigned char volatile izaehl=1, fehl=0;              // globale Byte-Variable
float m_Strecke_d=99;                                 // MESSSTRCKE IN CM
ISR (TIMER0_OVF_vect)                                 // Timer0 Überlauf
{
  izaehl++;if(izaehl > 62)                            // Interruptzähler

  {
    izaehl = 1; msek++;  
    if(msek >= 1000) { msek=0; sek++; }              // Zähler erhöhen
    if(sek >= 3) fehl = 1;                           // Überlauf-Fehlermarke setzen
  }
}

void main(void)
{
  unsigned char auskmhh, auskmhl;
  unsigned int time=0;
  int kmh;
  DDRA = 0xff;                      // Port A sind Ausgänge
  DDRC = 0xf0;                      // Port C PD4..PD7 sind Ausgänge
  TIMSK |= 1 << TOIE0;              // Timer0 Interrupt frei
  TCNT0 = 0;                        // Timer0 löschen
  PORTC = 0b00110000;               // Anzeige "---"
  PORTA = 0b00110011;
  while (PIND & (1 << PIND2));      // warte auf erste fallende Flanke PD2
  while (1)                         // Arbeitsschleife
  {
    TCCR0 = 1 << CS00; sei();                      // Timer0 start Teiler=1 Interrupt frei
    PORTA = 0b00000000; PORTC = 0b00000000;        // Anzeige "   " während der Messung  
    while(PIND & (1 << PIND3));                    // wartet auf fallende Flanke PD3
    TCCR0 = 0; cli();                              // Timer0 stopp Interrupt sperren
    time = (sek*1000) + (msek);                    // Berechnung der Zeit in ms
    kmh= (m_Strecke_d/time)*360;                   // Berechnung der Geschwindigkeit
    auskmhh = ((kmh/100) << 4) ;                   // KM/H Hunderter in BCD
    auskmhl = (((kmh%100)/10)<<4) | (kmh%10);      // KM/H Zehner und Einer in BCD
    TCNT0 = 0; izaehl = 1; msek = 0; sek = 0;
    while (PIND & (1 << PIND2))                    // warte auf fallende Flanke
    {
      if (fehl ==1) { PORTA = 0b01000100; PORTC = 0b01010000;}  // Fehlermarke "E r r"
      if (fehl ==0) 
        { 
          if (kmh>=255)
            {
              PORTC=0b01010000;
              PORTA=0b01000100;
            }
          if (kmh>=100)
            {
              PORTC=~auskmhh;
              PORTA=~auskmhl;
            }
          if (kmh<=99)
            {
              PORTC = 0b00000000;
              PORTA = ~auskmhl;
            }
        }
    }                // Ende while wartet auf fallende Flanke
    fehl = 0;
  }                  // Ende while Arbeitsschleife
}                    // Ende main

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.