Bascom 230Volt Lüfter mit Atmega8 und 7segment steuern

Thorsten_Sch

Mitglied
31. Okt. 2010
152
0
16
47
HH
Sprachen
  1. BascomAVR
Hallo Liebe Forum Gemeinde und Bastler

Ich möchte gern einen Lüfter 230Volt ~ steuern der nach zeit ausgeht.

Meine Bauteile die ich mir denke:
1x ATmega8 - 8Mhz Intern
2x Realis ( Stufe1 ) und ( Stufe3 )

4x 7Segment Anzeigen ( Temparatur ) ( ZEIT )
Die ZEIT soll Von 30Min. Bis 2Stunden Einstellbar sein per Taster und led Anzeige
LED 30Min = Taster
LED 1Stunde = Taster
LED 2 Stunden = Taster
LED Dauer = Taster

Und eben der rest von der schaltung.

So jetzt hab ich aber ein kleines proplem mit den TIMER sowie mit der 7Segment Anzeigen das alles einzubinden bitte euch mir Ratschläge zu geben und Tipps. meine schaltung Folgt in Kürze.....

Hab erst mal vielen dank
 
Hallo,

Schildere doch mal wo genau dein Problem ist... Timer? Was genau klappt oder verstehst du denn nicht?

Ich würde einen Timer initialisieren... Den dann im Overflow Mode laufen lassen... Dort generierst du deine zeitbasen und multiplexen... Wenn die Zeit nicht auf die Sekunde genau sein muss...
 
<-- stiebitzt @Hemi die Kristallkugel, und versucht durch die Kleberückstände hindurch was zu erkennen...

Thorsten wird aus diversen anderen Projekten irgendwelche Code-Trümmer haben, die zusammen nicht arbeiten wollen.
Wir dürfen jetzt spekulieren, ob die Siebensegmente direkt durch den Mega8 ge-multiplext werden, oder ob die vielleicht Huckepack auf einem seriellen Portexpander sitzen. TWI oder SPI...

Was für eine Zeit soll da angezeigt werden?
Woher die Temperatur (der Mega8 hat keinen internen "Sensor" am ADC)?

Janiiix hat ja schon Vorschläge in der richtigen Richtung gegeben, zum Multiplexen hatte ich schon mehrfach mein Konzept mit OC- und Überlauf-IRQ eines Timers vorgestellt (also PWM statt Overflow-Mode). An den TOV können dann weitere Zeitbasen gekoppelt werden (->Janiiix).

Außerdem bietet sich beim Multiplexen die Verwendung einer Tabelle für die Zeichen-Muster im SRAM an - die Adresse des darzustellenden Zeichens wird dann aus der Startadresse der Tabelle (Offset) und er darzustellenden Ziffer berechnet (addiert - wobei man den Offset auch sinnig festlegen kann, zB bei 0x0100) - da findet man hier im Forum sicher irgendwo was von Alabel zu...

<-- läßt Die Kristallkugel zurück zu Heinrich kullern
 
hmm...erscheint mir etwas konfus die Projektbschreibung von Thorsten.
Ich w ü r d e folgendes machen:

einen Uhrenquarz auf 1 Hz runterteilen und dieses Signal auf einen Interrupt legen.
eine ISR zählt dann jeweils um 1 hoch.
In der Main wird der akt. Wert mit dem vorgebenen Wert max 7200 verglichen.
Ist dieser erreicht, dann schaltet der Lüfter aus. Frage: ist dann Ende, oder ab wann erfolgt der Neustart?

wenn ich die Vorgaben richtig lese, dann dürfte es nur folgende Zeiten geben: 30min, 1h, 1h30 und 2h.

Was soll eigentlich auf der Anzeige ausgegeben werden? (Restlaufzeit?)

Man könnte eigentlich die Anzahl der Tastendrücke akkumulieren und daraus die Zeit ableiten.

Erinnert mich eigentlich alles an meinen alten Chef, der da sagte, sehen sie mal alles vor, habe keine Ahnung.

mfg
Addi
 
Bisher hat Thorsten auf mehrfache Nachfragen nicht konkretisiert, was das ganze eigentlich wirklich macht/machen soll, wie die Schaltung genau aufgebaut ist.
  • 2 Relais??
  • vier Siebensegment-Digits - an einem seriellen Portexpander, oder direkt gemultiplext?
  • Woher die Temperatur?
  • Welche Zeit (woher)?
  • LED-Anzeige?
  • Was soll LED Zeit=Taster heißen?
Wenn ich da oben alles weglasse was unklar ist, bleibt eigentlich nur: "Ich habe ein Problem mit dem TIMER, aber ich sage Euch nicht welches. Und nun helft mir mal!"

@addi : 'n Uhrenquarz allein macht ja noch keinen Takt am AVR - Du brauchst einen Oszillator mit Uhrenquarz. Also entweder einen fertigen Quarzoszillator, oder einen diskret aufgebauten. Beim Mega8 besitzt Timer2 einen Oszillator, der auf einen extern anzuschließenden Uhrenquarz ausgelegt ist - Timer2 kann also asynchron (zum restlichen Controller) mit einem eigenen Uhrenquarz betaktet werden.

Stellt sich nur noch die Frage, ob Thorsten derlei exakte Sekunden braucht, oder ob eine aus dem Systemtakt abgeleitete Zeitbasis (die für eventuelles Multiplexing, Tastenentprellung usw eh gebraucht wird) hinreichend genau ist.

P.S.: man könnte den Uhrenquarz auch als Systemtakt-Quelle benutzen (also mit dem internen Low frequenzy crystal oszillator). Eventuelles Multiplexing wird dann möglicherweise 'ne Herausforderung.
 
@LotadaC:
Ich hatte leider zu komplex gedacht ,mit uhrenquarz und 1 Hz signal setzte Ich eigentlich die komplette signalaufbereitungskette voraus . Demnaechst etwas auafuehrlicher
mfg
addi
 
Hallo endschuldig das ich jetzt erst schreibe

Hier die schaltung:
Unbenannt.PNG

Und hier der code OHNE 7 SEGMENT ANZEIGE:


CodeBox BascomAVR
'Ausschalt-Timer mit Stufen
'Einschalten durch Taste
'Wahl der Stufe innerhalb von 3 Sekunden
'Verlängern um X skunden durch Tastendruck
'Stufe 0: Aus
'Stufe 1: 2 Minuten
'Stufe 2: 5 Minuten
'Stufe 3: 1 Stunde
'Stufe 4: immer An  Taste= Aus
'
'ÌN : Taster  an PD.2
'OUT: Grüne LED an PB.1 Licht/Verbraucher
'OUT: Gelbe LED an PB.2 Blinkt im Sekundentakt
'OUT: Rote  LED als Stufenanzeige an PC.1 bis PC.4
'OUT: Rote  LED als 5 Sekunden - Restanzeige an PC.0
'
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 32
$swstack = 10
$framesize = 40

Config Debounce = 50

Config Portb.1 = Output
Licht Alias Portb.1

Config Portb.2 = Output

Config Portc = Output

Config Pind.2 = Input
Portd.2 = 1

Config Timer1 = Timer , Prescale = 64
On Timer1 Timer1_isr
Enable Timer1
Enable Interrupts
Const Timerstartwert = 49911
Timer1 = Timerstartwert

Const Stufe0_zeit = 0
Const Stufe1_zeit = 120  '2 Minuten
Const Stufe2_zeit = 300  '5 Minuten
Const Stufe3_zeit = 3600  '1 Stunde
Const Stufe4_zeit = 9999  'Immer An
Const Verlaengerung = 30

Dim Stufe As Byte
Dim Eingabefenster As Byte
Dim Restzeit As Word

Portc = 255
Waitms 2000
Portc = 0

Do
Restzeitanzeige:
'0---5---I---II---III---IV  Zeit Stufen
'0  1  2  3  4  Anzahl LEDs
'X  Letzte 5 Sekunden
If Restzeit = 0 Then Portc = 0
If Restzeit > 0 And Restzeit <= 5 Then Portc = &B00000011
If Restzeit > 5 And Restzeit <= Stufe1_zeit Then Portc = &B00000010
If Restzeit > Stufe1_zeit And Restzeit <= Stufe2_zeit Then Portc = &B00000110
If Restzeit > Stufe2_zeit And Restzeit <= Stufe3_zeit Then Portc = &B00001110
If Restzeit > Stufe3_zeit Then Portc = &B00011110


'An oder Aus
  If Restzeit > 0 Then
  Licht = 1
  Else
  Licht = 0
  End If

Debounce Pind.2 , 0 , Tastenroutine , Sub

Loop
End


Tastenroutine:
If Eingabefenster = 0 And Restzeit = 0 Then
  Timer1 = 0
  Eingabefenster = 3
  Stufe = 1
  Restzeit = Stufe1_zeit

Elseif Eingabefenster > 0 And Restzeit > 0 Then
  Incr Stufe
  If Stufe = 5 Then Stufe = 0
  Select Case Stufe
  Case 0 : Restzeit = Stufe0_zeit
  Case 1 : Restzeit = Stufe1_zeit
  Case 2 : Restzeit = Stufe2_zeit
  Case 3 : Restzeit = Stufe3_zeit
  Case 4 : Restzeit = Stufe4_zeit
  End Select

Elseif Eingabefenster = 0 And Restzeit > 0 Then
  Restzeit = Restzeit + Verlaengerung

  If Stufe = 4 Then
  Stufe = 0
  Restzeit = 0
  End If
End If
Return



Timer1_isr:
Timer1 = Timerstartwert
Toggle Portb.2
If Eingabefenster > 0 Then Decr Eingabefenster
If Restzeit > 0 Then Decr Restzeit
If Stufe = 4 Then Restzeit = Stufe4_zeit
Return


wie wird denn da die zeit in Segment zur anzeige hier eingebaut?

Vielen dank bis jetzt und einen schönen sonntag
 
So...

irgendwie scheint der Schaltplan nicht so recht zum Code zu passen. Aber das war ja nicht das Problem.
Laut Crystal-Direktive sagst Du Bascom, daß der Controller angeblich mit 8MHz läuft - deine Timerkonfiguration paßt alledings zu 1MHz (TOV jede Sekunde).

Zum eigentlichen Thema:
Der Controller soll offensichtlich die vier Digits selbst ansteuern (direkt), also (unter Berücksichtigung der verwendeten Controllerbeine) multiplexen.
Prinzipiell kannst Du dafür auch deinen Sekunden-Timer verwenden (der dann natürlich schneller ticken müßte), aber mit'nem seperaten Timer ist's für Dich vielleicht verständlicher.
Aufgabe des (zweiten) Timers ist es also, alle vier Common-Leitungen der Digits abzuschalten, das neue Muster den Segmente Port zu legen, und dann das nächste Digit mit seiner Common anzuschalten. 'Ne Weile leuchten lassen, und wieder von vorn.
(Ich würde dazu statt eines Interruptes sogar zwei nutzen (den OutputCompare zum abschalten aller Digits, und den TOV zum umschalten der Segmente und anschalten des einen Digits)Wegen der Pufferung also fastPWM, aber auch hier ist der normalMode mit nur einem TOV-Interrupt vielleicht verständlicher).
Mit jedem Timerdurchlauf wird ein Digit dargestellt, Du hast vier Digits - wären also vier TOVs für die ganze Anzeige (ein "Bild").
Dein Controller läuft mit 1MHz, Timer0 (oder auch 2) macht 256 Schritte, wären über den Daumen 4kHz bei den TOVs. Vier TOVs ein Bild, wäre 'ne Bildwiderholfrequenz von 1kHz. Bauch sagt, daß 100Hz reichen sollten, also teilen wir den Timer mit Prescaler=8 runter, wären über den Daumen 125Hz.
Im SRAM hälst Du jetzt, quasi als Schatten-Abbild, die Muster der vier Digits bereit (in BASCOM am einfachsten als Array), und das derzeitige Digit (1 bis 4).
In der ISR schaltest Du also alle Commons ab, inkrementierst Deinen Digit-Pointer, prüfst ob er jetzt vielleicht 5 ist und setzt ihn auf 1 zurück. Legst Schattenabblid(digit-Pointer) auf die Segmente und aktivierst die entsprechende Digit.
Damit kümmert sich der Timer mit einer relativ kurzen ISR um das Multiplexing; was dargestellt werden soll, schreibt Dein Hauptprogramm ins Schattenabbild.

Wahrscheinlich willst Du auf dem Display die Restlaufzeit ausgeben, also zwei Digits für die Minuten, zwei für die Sekunden. Derzeit hast Du quasi ein Sekundenzählwerk, ich würde wegen den Digits entsprechend das ganze "Uhrwerk" anpassen, also für jedes Digit 'ne eigene Zählvariable nehmen - beim dekrementieren erstmal die Sekundeneiner dekrementieren. Laufen die über, auf neun setzen und die Sekundenzehner dekremeitieren, usw...
Wurde eine dieser Variablen geändert (also dekrement bzw auf Neun oder Fünf setzen), Schreibst Du das entsprechende Bitmuster in die entsprechende Position im Schattenabbild (Sekundeneiner --> Schattenabbild(4), Stundenzehner --> Schattenabbild(1))
Und wie machst Du aus der Ziffer das Muster?
Sinnigerweise, indem Du die Muster in'ner geeigneten Tabelle ablegst, in Bascom zB in einem Zeichen-Array. Zeichen(5) zB enthält das Muster der 5. im 'ne 5 als Zehnerstunde auszugeben lautet die Zuweisung Schattenabbild(1)=Ziffern(5), klar?
Für Dauer-An oder -Aus kannst Du auch entsprechende (konstante) Muster in's Schattenabbild schreiben, ebenso für Deine Stufenauswahl.

P.S. @Dirk : Das Forum ist mit 2kbit/s Download echt kein Vergnügen...
 
Indem man sehr weit draußen auf'm Land ist, kein irgendwie gearteter Festnetzanbieter irgendwelche Strippen ziehen will, und über den Äther nur 1G/2G vorhanden ist (natürlich nur mit begrenzter Kapazität).
Angeblich soll 4G nutzbar sein, aber das gibt mein Vertrag nicht her, hätte ich vielleicht so'ne Prepaid-Daten-SIM-Card (mit 4G??) ins Mobile stecken können?

Dafür haste da oben praktisch jeden Abend sowas direkt vor der Haustür (wenn nich grad wieder irgendwer sein Fahrzeug direkt auf der "Bühne" parken muß.)Medium 6602 anzeigenAber genug OT, wieder zu Hause...
 
  • Like
Reaktionen: maik
Na super

Hallo an die Forum und Bastler
Ich hab ihr mich um rat gebeten und es wird hier über das funknetzt geredet ts ts.
Hat da jemand ne Infomation

Gruß Thorsten Sch.
 
Zu Deinem Problem mit dem Multiplexing der Siebensegmente? Da hatte ich mMn in Antwort #8 angedeutet. Das ganze sollte so weitgehend im Hintergrund (Timerinterrupt) laufen, während sich Dein Programm um den Rest kümmern kann.
Wo hast Du jetzt noch Probleme?
 
Na super

Hallo an die Forum und Bastler
Ich hab ihr mich um rat gebeten und es wird hier über das funknetzt geredet ts ts.
Hat da jemand ne Infomation

LotadaC hat dir in seiner Freizeit aus seinem Urlaub mit schlechter Internetverbindung versucht zu helfen (eventuell hat er alles doppelt geschrieben). Deshalb ging es kurz um die Verbindungsqualität. Von dir kam seit gut 7 Wochen keine Antwort oder Nachfrage mehr. Hast du dir seinen Beitrag durchgelesen? Du bist anscheinend nicht weiter gekommen, Probleme bestehen immer noch? Wo liegen die?
 
Hallo Forum ich werde darüber noch mal nach denken... erst mal danke....
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)