AVR Programmierung, Attiny13

Leinad78

Neuling
Thread Starter
Mitglied seit
06.02.2008
Beiträge
838
Ort
BN, NRW
Hallo zusammen,

ich bin mir nicht ganz sicher ob dieses Unterforum der richtige Bereich ist, wenns falsch sein sollte dann bitte verschieben.

Zu meinem Anliegen:

Ich suche jemanden, der mir ein einfaches Programm für einen Attiny13 schreiben kann.

Ich benötige eine Schaltung, in der ein einfacher Taster eine Selbsthaltung eines Ausgangs solange hält, bis man den Taster erneut betätigt. An den Ausgang möchte ich dann einen PNP Transistor hängen um damit wiederum ein Magnetventil schalten zu können.

Ich habe die Hardware zum Beschreiben und die Tinys selber da, ich hab nur keinen Dunst wie man nen brauchbares Programm aufbaut.

Fühlt sich jemand in der Lage das zu schreiben?
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Hast du den auch etwas zur Taster entprellung? Das Programm an sich würde ich sonst recht einfach aufbauen. Wenn der Taster betätigt wird Variable auf eins setzen, Aktor ein. Wenn er noch mal betätigt wird, die Variable wieder auf Null setzen und den Aktor ausschalten
 
Nutzt man nicht extra nen kleinen Baustein wie nen Attiny für ne Software-Entprellung? Sonst könnte ich das ganze auch mit nem Flipflop aufbauen, was aber vom Schaltungsaufwand deutlich komplexer wird.
 
Naja Flip Flop, wären nur zwei FlipFlops. Natürlich kann man das.

Code:
//----------------------------------------------------------------------// Funktion      : Schalten eines Transistors
// Schaltung    : 
//----------------------------------------------------------------------
// Prozessor     : Attiny13
// Sprache        : C
// Frequenz        : 16000000
// Datum        : 17.05.2013
// Version       : 
// Autor         : EliteSoldier
//----------------------------------------------------------------------
//- Definierungen ------------------------------------------------------
//----------------------------------------------------------------------
#define     F_CPU     16000000                            // Frequenz des µC
//----------------------------------------------------------------------
//- Headerdateien ------------------------------------------------------
//----------------------------------------------------------------------
#include    <avr\io.h>                                    // AVR Register und Konstantendefinitionen
#include    <util\delay.h>                                // Warteroutinen
//----------------------------------------------------------------------
// Normale Variablen
int         taster            =   0;
int            wait            = 200;
//  8 Bit Variablen            
// 16 Bit Variablen
// Arrays
//----------------------------------------------------------------------
//- Unterprogramm ------------------------------------------------------
//----------------------------------------------------------------------
//----------------------------------------------------------------------
// Initialisierung Unterprogramme/Schnittstellen
//----------------------------------------------------------------------
// Initialisierung der UART Schnittstelle
int initProg(void)
{
    // - Portdefinierungen
    /**
    Ausgang        1
    Eingang        0
    **/
    DDRA |= (0 << DDA0)|(0 << DDA1)|(0 << DDA4);        // Eingang / Taster
    PORTB = 0b00000111;                                    // Pull Up Widerstand
    DDRB  = 0b00111000;                                    // Eingang u. Ausgang / Sensor und Aktoren
    DDRC |= (1 << DDC0)|(1 << DDC1)|(1 << DDC2);        // Ausgang / DA-Wandler
}
int swich_check(void)
{
    if((PINA&0x01) == 1)
    {
        if(taster == 0)
        {
            sleep(wait);
            taster = 1;
        }
        else if(taster == 1)
        {
            sleep(wait);
            taster = 0;
        }
    }
    
}
int aktor_switch(void)
{
    switch(taster)
        case 0:
        {
            PORTB |= (1 << PA0);                         // Port setzen
        }
        case 1:
        {
            PORTB |= (0 << PA0)
        }
}
//-----------------------------------------------------------------------
//- Hauptprogramm -------------------------------------------------------
//-----------------------------------------------------------------------
int main()                        
{
    initProg();                                                // Unterprogramme initialisieren
    while(1)                                                // Mainloop
    {                
        switch_check();
        aktor_Switch();
    }
}
//- Programmende --------------------------------------------------------

Paar stellen musst du anpassen, ich benutze hier einen ATmega32.
 
Äh, haste nen Tip was man da anpassen müßte? Ich versteh wie gesagt nur Bahnhof bei dem Programm :hmm:
 
Guten Morgen,

ich habe mich jetzt mal die letzten 2 Tage ein wenig mit dem Thema auseinander gesetzt und mir so ne Lernbox für Mikrocontroller besorgt. Da ist zufällig nen Beispiel für nen Toggle-Flipflop drin, allerdings keine Entprellung.

Die Programmierung ist da glaube ich in Assembler, das sieht halt wieder deutlich anders aus.

Kannst Du da evtl ne Entprellung integrieren?

Code:
;toggle.asm, pb0=clock,
;pb4=q, pb3=/q

.include "tn13def.inc"

rjmp anfang
anfang:

sbi ddrb,4
sbi ddrb,3

Schleife:
rcall warteaufflanke
cbi portb,4
sbi portb,3
rcall warteaufflanke
sbi portb,4
cbi portb,3
rjmp Schleife

warteaufflanke:
warteauflow:
sbic pinb,0 ;pb0=0?
rjmp warteauflow
warteaufhigh:
sbis pinb,0 ;pb0=1?
rjmp warteaufhigh
ret
 
Oja, Assembler und ich stehen auf Kriegsfuß. Grundsätzlich fasse ich das nicht an, allerdings sieht das recht übersichtlich aus.

Wie es aussieht wartet er auf High und Low Flanke in einem Unterprogramm. Die Entprellung machst du dann mittels einer Wartezeit. Also dort wo er abfragt und der Variable einen Wert zu ordnet (xyz=0). Hier hinter einfach die Wartezeit setzen. Das gleiche dann wo er die Variable auf 1 setzt.

Der Text ist mittels Tapatalk geschrieben, zitieren macht da nicht viel Spaß.
 
Sicherlich nicht die schönste Art, dafür aber quick ´n dirty und selber erdacht :cool:

Code:
;toggle_Debounce.asm, pb0=clock,
;pb4=q, pb3=/q

.include "tn13def.inc"

rjmp Anfang
Anfang:

	sbi ddrb,4 ;PB4 = Ausgang
	sbi ddrb,3 ;PB3 = Ausgang
	cbi portb,4 ;PB4 = 0
	sbi portb,3 ;PB3 = 1

Schleife:
	rcall WarteAufFlanke ;Aufruf1 Statusabfrage
	cbi portb,4 
	sbi portb,3
	rcall Warten ;Aufruf zur Warteschleife
	rcall warteaufflanke ;Aufruf2 Statusabfrage
	sbi portb,4
	cbi portb,3
	rcall Warten ;Aufruf zur Warteschleife
	rjmp Schleife

WarteAufFlanke:
WarteAufLow:
	sbic pinb,0 ;pb0=0?
	rjmp WarteAufLow
WarteAufHigh:
	sbis pinb,0 ;pb0=1?
	rjmp WarteAufHigh
	ret
Warten:
	ldi r16, 255
Warten1:
	ldi r17, 255
Warten2:
	dec r17
	brne Warten2
	dec r16
	brne Warten1
	ret
 

Ähnliche Themen

Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh