PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Frage zum Programmablauf



Freakster235
29.11.2007, 19:50
Hallo Leute,

ich lese schon eine ganze Weile hier im Forum mit und will nun auch ein kleines Projekt verwirklichen und bräuchte dazu Ratschläge und Hilfe.
Bin also totaler anfänger hab außer wenn man einen taster drückt brennt ein LED noch nicht viel geschafft unter BASCOM.

Ich habe einen ATTINY25 ohne weitere exterene Beschaltung den ich mit Bascom Programmieren will.

Folgendes soll der ATTINY machen:

wenn an PB0 low anliegt soll PB1 auf high geschaltet werden 4 sekunden warten danach PB2 auf High schalten.
Der Pegel an PB0 ist ein BUS ändert also ständig zwischen High und Low.
Wenn der Pegel am Bus Länger als 10 Minuten auf High (Ruhezustand) ist sollen PB1 und PB2 auf Low schalten.

Wie realisiert man sowas am besten vom Programmablauf her? Wie muss ich die Timer benutzen?

Vielen Dank für eure Hilfe.

Gruss Freaky!

Freakster235
30.11.2007, 11:27
Hallo,

warum will mir eigentlich keiner Antworten? Es duerfte doch fuer geuebte Leute kein Problem sein mir zu sagen wie ich das Programm am besten Ablaufen lasse.

Danke!

PicNick
30.11.2007, 13:10
DIe Lösung ist davon abhängig, wie kurz oder lang ein LOW-Inpuls an PB0 ist bzw. sein kann.
Sprich: wie häufig muß man nachsehen, damit einem so ein LOW-Signal nicht durch die Lappen geht ?

Freakster235
30.11.2007, 14:12
Hallo,

also es handelt sich um den I-Bus des BMW.
Die baudrate ist 9600 Kbits/s
Ein Telegramm dauert zwischen 5ms und 30ms.
Also sind die LOW Zeiten recht kurz.
Der ATTINY hat 20Mhz.

Gruss Freaky!

PicNick
30.11.2007, 14:56
I see.
Dann gibts drei Möglichkeiten:

In der Haupt DO-LOOP Schleife dein Input kontrollieren und in einer TIMER- Interrupt-Routine für die Beleuchtung sorgen.

In der DO-LOOP Schleife die Beleuchtung und die Input-Kontrolle mit einem "Externen Interrupt" machen.

In der DO-LOOP Schleife nix,
die Beleuchtung im Timer-Interrupt
Input-Kontrolle im "externen" Interrupt


In allen Fällen gleich, nur eben anders placiert:

Initialisierung


Zähler für die 10 Minuten laden
Zähler für die 4 Sekunden auf NULL


Input Kontrolle:


Wenn PB0 = 0 (low)
PB1 auf HIGH
Zähler für die 10 Minuten zurücksetzen
Zähler für die 4 Sekunden laden
ENDIF


Beleuchtung:


Wenn 4-Sekundenzähler > 0
-1
Ist der Zähler dann auf null
PB2 auf HIGH
endif
endif

Wenn 10-Minutenzähler > 0
-1
Ist der Zähler dann auf null
PB1 auf LOW
PB2 auf LOW
endif
endif

Freakster235
01.12.2007, 11:27
Hallo,

bin grad dabei das ganze in ein Programm umzusetzen.
Eine frage, beim Attiny heissen die Iinterrupts ja PCINT Pinchange Int.

Wie muss ich die intialisieren? Irgendwie klappt das net.
Hab mir die Initialisierung aus dem INT0.BAS abgeguckt und nur INT0 in PCINT0 geaendert, aber das klappt leider net...

Danke!

Freakster235
01.12.2007, 19:32
Hallo Leute,

ich habe etz ein Funktionierendes Programm. Kann sich das mal jemand anugcken und Optimierungsvorschlaege machen?
Wie gesagt, mein erstes Programm.


$regfile = "ATtiny25.dat"
$crystal = 1000000

Config Pinb.0 = Input
Config Portb.1 = Output
Config Portb.2 = Output
Config Timer0 = Timer , Prescale = 1024
Disable Timer0
On Timer0 Timer0_isr
Enable Interrupts
Dim Tdown As Integer
Dim Tbus As Integer
Dim Tstat As Integer
Dim Busstat As Integer

Tdown = 2400
Tbus = 16
Tstat = 0
Busstat = 0

Ibus Alias Pinb.0
K1 Alias Portb.1
K2 Alias Portb.2

K1 = 1
K2 = 1

Do
If Ibus = 0 And Tstat = 0 Then
K1 = 0
Tstat = 1
Enable Timer0
End If
If Ibus = 0 And Tstat = 1 And Busstat = 1 Then
Tdown = 2400
End If
Loop
End

Timer0_isr:
Decr Tdown
Decr Tbus
If Tdown = 0 Then
K1 = 1
K2 = 1
Tstat = 0
Tdown = 2400
Tbus = 16
Disable Timer0
End If
If Tbus = 0 Then
K2 = 0
Busstat = 1
End If
Return


Vielen Dank!