ATmega16 PORTC prüfen welches Bit zuerst gesetzt wurde

OP #2955591
Lesenswert?
• ▲
▼
Guten Tag

Die acht Eingänge am PORTC sollen ständig überwacht werden. Sobald ein 
Bit gesetzt ist, soll festgestellt werden, an welchem Pin die Spannung 
anliegt. Alle später gesetzten Bits können ignoriert werden.

Folgender einfacher Ansatz bisher:
1
    // ErrFlag kann per Taste wieder rückgesetzt werden
2
    // Am Port C ist ein Bit gesetzt worden
3
    if ( (ErrFlag == 0) & (PINC != 0) )
4
    {
5
      ErrFlag = 1;
6
      // Kanal bzw. Zustand festhalten
7
      ErrChnl = PINC; // -> Hier kann PINC bereits wieder 0 sein oder mehrere bits sind gesetzt!!
8
      // Ausgabe an LCD
9
      dogm_clear();
10
      dogm_gotoxy(0, 0);
11
      dogm_puts(itoa(ErrChnl, TempBufferLCD, 10));
12
    }

Wie kann zuverlässig festgestellt werden, welches Bit zuerst gesetzt 
wurde? Hiermit möchte ich prüfen welcher "Kanal" zuerst auf TRUE geht.

Vielen Dank!
Gruss Samuel
OP #2955894
Lesenswert?
• ▲
▼
Vielen Dank, ja das stimmt. Am Port C kann nach dem ersten Setzen eines 
Pin's nach 1ms bereits ein weiteres Signal an einem anderen Pin anstehen 
(dieses und auch darauf folgende Signale sollen nicht mehr beachtet 
werden).

Verwendet wird derzeit der interne 1MHz Oszillator.

Samuel
#2955945
Lesenswert?
• ▲
▼
Samuel Brütsch schrieb:
> Vielen Dank, ja das stimmt. Am Port C kann nach dem ersten Setzen eines
> Pin's nach 1ms

1 Millisekunde ist für den µC eine halbe Ewigkeit.
Lies den PINC ein und prüfe Bit für Bit, ob eines auf 1 ist.
Wenn ja -> weiter verfahren wie immer du möchtest.

wenn der µC sonst nichts zu tun hat, zb.
1
   while( 1 )
2
   {
3
     Input = PINC;
4

5
     if( Input & 0x01 ) {
6
       Bit 0 war zuerst auf 1
7
     }
8
     else if( Input & 0x02 ) {
9
       Bit 1 war zuerst auf 1
10
     }
11
     else if( Input & 0x04 ) {
12
       Bit 2 war zuerst auf 1
13
     }
14
     ....
15

16
     // warte drauf, dass wieder Ruhe einkehrt und alles auf 0
17
     // zurückflutscht.
18
     while( PINC )
19
       ;
20
   }
Gast #2955946
Lesenswert?
• ▲
▼
Also musst du mit einer Auflösung von höher 1 kHz abtasten. Dafür kannst 
du einen Timer verwenden, oder du pollst in einer Endlosschleife wenn 
das Programm sonst nichts mehr machen soll.
      Dazu muss aber das Signal "anliegen bleiben". Kurze Spikes 
erkennst du damit nicht.

      Möglich wären auch externe Interrupts. Die gibts aber nicht an 
alle Pins. Einige Atmels (ob deiner dazugehört weiß ich nicht) haben den 
Pin-Change-Interrupt, der gilt für einen kompletten Port, du müsstest 
also in der ISR noch den Pin auslesen.
      Dazu sollte das Eingangssignal aber "sauber" sein. Also kein 
Rauschen oder Prellen.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.