Forum: Mikrocontroller und Digitale Elektronik High Low Pegel richtig auf Ausgänge aufteilen..


von Huber M. (michael_h784)


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
}

: Bearbeitet durch Moderator
von Falk B. (falk)


Lesenswert?

Bitte verschieben.

von Hosenmatz (Gast)


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.

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.