High Low Pegel richtig auf Ausgänge aufteilen..

OP #4678192
Lesenswert?
• ▲
▼
Hallo,

da ich Anfänger bin wollte ich mal um Unterstützung bitten. Und zwar wie 
man folgendes am besten in der Regel umsetzt? Ich will an einem Eingang 
PB2 (int0)einem High Low pegel auswerten. Wenn PB2(int0) High ist, soll 
PB1 einschalten, nach kurzer verzögerung wieder aus. Dann soll PA7 
einschalten, wenn jetzt der Pegel null wird, dann soll PA7 ausschalten, 
und wieder PB1 einschalten, und nach kurzer verzögerung wiederaus. dann 
soll PA3 einschalten, wenn jetzt der pegel wieder high wird, soll es 
wieder von vorne mit PB1 losgehen. Jetzt dachte ich mir ob man das nicht 
zb. mit einer Interrupt Service Routine lösen könnte.Allerdings als 
Anfängergar nicht sooo easy.Oder vielleicht geht das auch ganz anders?
Wäre das nach folgende ansatzweise dafür geeignet?
1
/*
2
 * Attiny24a_INT0.c
3
 *
4
 * Created: 10.08.2016 15:11:16
5
 *  Author: Huber
6
 */ 
7
#define F_CPU 1000000UL
8
#include <util/delay.h>
9
#include <avr/interrupt.h>
10
#include <avr/io.h>
11

12
ISR (EXT_INT0_vect)
13
{
14
  PORTA^=(1<<);
15
  
16
  
17
  
18
}
19
int main(void)
20
{//Ausgänge einstellen
21
  DDRA |= (1<<PA3)|(1<<PA7);
22
  DDRB |=(1<<PB1);
23
 //Eingänge einstellen PULLUPS
24
   PORTB|= (1<<PB2);
25
 //ISR interrupt service (INT0) routine einstellen
26
 MCUCR |= (1<<ISC01);
27
 GIMSK |= (1<<INT0);
28
 sei();
29
    
30
  while(1)
31
    {
32
        
33
    }
34
}
Gast #4678241
Lesenswert?
• ▲
▼
Naja. Bis auf die Tatsache, dass man bei komplexeren Vorgängen die 
Portbits nicht direkt im Interrupt setzt, ja. Man macht das deswegen 
nicht, um das Abmessen von Zeit organisatorisch von den Vorgängen die 
daraus folgen und darüber hinaus, den sonstigen Bedingungen zu trennen. 
Die meisten Profis halten das für übersichtlicher. Siehe unten, wo ich 
Statemachines erwähne.

Timer sind in solchen Fällen an sich empfehlenswert. Bei langen Zeiten 
(im Bereich von Millisekunden) benötigt man sie nicht unbedingt. 
Andererseits ist das genaue (also etwa in Bereichen von 10-100ns 
Genauigkeit) Verzögern bzw. Abmessen von Zeit dann doch fast nur mit 
Timern möglich. Kommt auf Deine Anforderungen an.

Zusätzlich empfehle ich Dir, wie schon erwähnt, den Einsatz einer 
"Statemachine". 
https://www.mikrocontroller.net/articles/Statemachine#Implementierung_einer_objektorientiert_Finite_State_Machine_in_C.2B.2B

Dazu zeichnest Du Dir zunächst, wie in dem Artikel beispielhaft gezeigt, 
ein Diagramm mit Zustandübergangen. In Deinem Fall erfolgen 
Zustandsübergänge auch wenn eine gewisse Zeit vorübergegangen ist - aber 
auch wenn sich Portbits ändern.

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.