Interrupt und Ausgang toggeln

Gast #3931228
Lesenswert?
• ▲
▼
Hallo!

Ich mache meine ersten Schritte mit GCC und C.
Für den Beginn möchte ich einen Ausgang toggeln, wenn ein Eingang 
betätigt wird:
1
// Eingang 1 schaltet das Relais 1 um
2
    if (PINB & (1<<PB0))
3
    {
4
    }
5
    else
6
    {
7
      if (PIND & (1<<PD0))
8
      {
9
        // Relais 1 ausschalten
10
        PORTD &= ~( 1 << PD0 );
11
      }
12
      else
13
      {
14
        // Relais 1 einschalten
15
        PORTD |= ( 1 << PD0 );
16
      }
17
    }


Davon abgesehen das mit mit einer negierung wohl die "else" vermeiden 
könnte:
Ist das so korrekt?

Kann aktuell wegen mangelder Hardware nur Simulieren und scheint zu 
passen.

Teste dann auf einem Atmega32 und Atmega644.

Toggeln unterstützen die Ausgänge ja nicht, oder?

2. Frage:
3 Interrupts wären verfügbar. Viel zu wenig. Ich habe in Summe 16 
Eingänge.
Ist also nur mit einer Schleife möglich und Interrupt eventuell für 3 
Eingänge erstellen?

Danke

Georg!
Gast #3931233
Lesenswert?
• ▲
▼
Georg schrieb:
> Toggeln unterstützen die Ausgänge ja nicht, oder?

du kannst so togglen:
1
PORTD ^= ( 1 << PD0 );  // toggle PD0

Problem hierbei ist, dass es sich um eine Read-Modify-Write Operation 
handelt. Wenn du also im Hauptprogramm auch noch mit PORTD arbeitest, 
wird es zu Problemen kommen (sehr selten, aber sie werden vorkommen).

Neuere AVRs unterstützen atomares Togglen mit folgender Zuweisung:
1
PIND = ( 1 << PD0 );  // toggle PD0


lg
Chris
Gast #3931252
Lesenswert?
• ▲
▼
Hallo!

Ok, danke für das toggeln. Hatte ich zwar gefunden, aber hatte nicht 
funktioniert. Die Simulation markiert die Zeile, führt die aber nicht 
aus.
Daher dachte ich der Befehl ist nicht korrekt!

@Chris:
Ja, ich weiß was du meinst. Der Ausgang wird von 2 Stellen gesteuert. 
Einmal der Input und einmal (hoffe das ich das hinbekomme) über UDP.

@npn:
Ich hatte zuerst: Lesen des Status des Ausgang und dann schalten.

Ist im Atmel eigentlich eine Entprellfunktion enthalten? Sonst muss ich 
diese auch noch reinbauen.
20ms sollten passen denk ich für einen normalen Taster?

Danke!

Georg
#3931257
Lesenswert?
• ▲
▼
Georg schrieb:

> 3 Interrupts wären verfügbar. Viel zu wenig. Ich habe in Summe 16
> Eingänge.

Was hängt an den Eingängen?

Nur weil du einen Eingang hast, bedeutet das ja nicht, dass du dazu 
einen externen Interrupt benötigst. Den brauchst du nur dann, wenn die 
Änderung am Eingangspin so schnell und so kurz erfolgt, dass du Gefahr 
läufst, sie in der Hauptschleife zu verpassen. Da dein µC aber ein paar 
Hunderttausend Befehle pro Sekunde abarbeitet, müssen die Änderungen an 
den Eingaängen dann schon sehr kurz und sehr schell sein, damit das 
passiert.

dein µC arbeitet
1
int main()
2
{
3
  ...
4

5
  while( 1 ) {
6

7
    if( PINB & ( 1 << PB0 ) )
8
      PORTD ^= ( 1 << PD0 );
9

10
    if( PINB & ( 1 << PB1 ) )
11
      PORTD ^= ( 1 << PD1 );
12

13
  }
14
}

so schnell ab, dass du als Mensch praktisch keine Verzögerung wahrnehmen 
kannst, egal wie schnell du auf einen von 2 Tastern drückst. Ganz im 
Gegenteil musst du hier sogar den µC künstlich bremsen
1
int main()
2
{
3
  ...
4

5
  while( 1 ) {
6

7
    if( PINB & ( 1 << PB0 ) )
8
      PORTD ^= ( 1 << PD0 );
9

10
    if( PINB & ( 1 << PB1 ) )
11
      PORTD ^= ( 1 << PD1 );
12

13

14
    _delay_ms( 100 );
15
  }
16
}

damit du vom Blinken noch was siehst. Ob 1, 2 oder 16 Eingänge spielt 
dabei nicht wirklich eine große Rolle. Das ist für deinen µC immer noch 
Kinderspiel.
Gast #3931297
Lesenswert?
• ▲
▼
Hallo Karl Heinz!

Ah, danke!
Wie geschrieben, aus Mangel der Hardware kann ich noch es nicht live 
testen.
Möchte aber etwas vorarbeiten.

An 8 Eingängen sollen Taster Relais schalten.
An 8 Eingängen die Rückmeldung der Relais.

Um kein neues Thema zu starten:
Weiß jemand wie man Ethersex und Atmega Studio zusammen nutzen kann?

Atmega Studio:
Hier schreibe ich die Applikation für den Atmega644. Ist das aber die 
Firmware?

Ethersex:
Hie kompiliere ich ja auch eine hex Datei.

Ich würde das eine ja mit dem anderen überschreiben, oder?

Danke!

Georg

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.