mikrocontroller.net

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


Autor: Huber M. (michael_h784)
Datum:

Bewertung
0 lesenswert
nicht 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?
/*
 * Attiny24a_INT0.c
 *
 * Created: 10.08.2016 15:11:16
 *  Author: Huber
 */ 
#define F_CPU 1000000UL
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/io.h>

ISR (EXT_INT0_vect)
{
  PORTA^=(1<<);
  
  
  
}
int main(void)
{//Ausgänge einstellen
  DDRA |= (1<<PA3)|(1<<PA7);
  DDRB |=(1<<PB1);
 //Eingänge einstellen PULLUPS
   PORTB|= (1<<PB2);
 //ISR interrupt service (INT0) routine einstellen
 MCUCR |= (1<<ISC01);
 GIMSK |= (1<<INT0);
 sei();
    
  while(1)
    {
        
    }
}

: Bearbeitet durch Moderator
Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte verschieben.

Autor: Hosenmatz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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/Statemach...

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.