Forum: Compiler & IDEs ATmega16 PORTC prüfen welches Bit zuerst gesetzt wurde


von Samuel B. (samb)


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

von Oliver S. (oliverso)


Lesenswert?

Samuel Brütsch schrieb:
> Hier kann PINC bereits wieder 0 sein oder mehrere bits sind gesetzt!!

Es ist deine Aufgabe, herauszufinden, wie schnell sich die Signale an 
den Eingängen ändern können, und zu spezifizieren, welche minimale 
Impulslänge du erkennen können möchtest. Erst, wenn du das weißt, kann 
man über einen geeignete Auswertung nachdenken.

Oliver

von Samuel B. (samb)


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

von Karl H. (kbuchegg)


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
   }

von jack (Gast)


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.

von Samuel B. (samb)


Lesenswert?

Danke für die raschen Antworten!

Gruss Samuel

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.