Sari la conținut
ELFORUM - Forumul electronistilor

BASCOM


yo9hnf

Postări Recomandate

Mai jos atasez schema si codul unui Timer cu attiny 2313, dar eu vreau sa modific codul astfel incat sa folosesc un atmega8 si fara circuitul de multiplexare, voi folosi quart intern.

Ma puteti ajuta? 

Posted Image

 

 

$regfile = "attiny2313.dat"                                 ' specify the used micro$crystal = 12000000                                         ' used crystal frequency$baud = 19200$hwstack = 32                                               ' default use 32 for the hardware stack$swstack = 24                                               ' default use 10 for the SW stack$framesize = 40                                             ' default use 40 for the frame space 'configsConfig Portb = &B00011111                                   'PB0,1,2,4 ulazi, ostalo izlaziPortb = &B11100000                                          'pullup na ulazimaConfig Portd = &B11100011                                   'PD2,3,4 - inputsPortd = &B00011100                                          'pullup na ulazimaConfig Debounce = 30                                        'config debounce to 30msConfig Timer1 = Timer , Prescale = 256 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1Config Int0 = Low Level                                     'needed to wake up MCU from powerdown 'define port pinSpeaker Alias Portb.0                                       'zvucnikRelay Alias Portb.1                                         'relejClock Alias Portb.2                                         '-------------------------------Dat Alias Portb.3                                           'upravljacki pinovi za registreStore Alias Portb.4                                         '------------------------------- S1 Alias Pind.2                                             '-------------------------------S2 Alias Pind.3                                             'tipkeS3 Alias Pind.4                                             '------------------------------- 'def flagsDim Check_keys_flag As BitDim Disp_update_flag As BitDim Middle_leds_flag As BitDim Timer1_toggle_flag As BitDim Make_noise_flag As BitDim Shutdown_flag As BitDim Read_eeprom_flag As BitDim Write_eeprom_flag As Bit'define variablesDim I As Byte , J As ByteDim Empty As ByteDim Disp(4) As ByteDim Value(4) As ByteDim Idlee As Byte 'define interruptsDisable Int0Enable Compare1aEnable InterruptsOn Compare1a Timer1_intCompare1a = 23436                                           'za 12MHz kristal i prescale=256 -> ISR svakih 0.5sStart Timer1 'define constantsConst Pulses = 400Const Periods = 333Set Read_eeprom_flag   '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Glavni program'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Do Debounce S1 , 0 , Key1 , SubIf Check_keys_flag = 0 Then   Debounce S2 , 0 , Key2 , Sub   Debounce S3 , 0 , Key3 , SubEnd If If Write_eeprom_flag = 1 Then Gosub Write_eepromIf Disp_update_flag = 1 Then Gosub Disp_updateIf Make_noise_flag = 1 Then Gosub Make_noiseIf Read_eeprom_flag = 1 Then Gosub Read_eepromIf Shutdown_flag = 1 Then Gosub Shutdown LoopEnd   '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Tipke'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Key1:Set Disp_update_flagSet Write_eeprom_flagToggle Check_keys_flag                                      'onemoguci postavljanje vremena dok je u tijeku odbrojavanjeToggle Timer1_toggle_flagToggle RelayReturn Key2:Decr Value(2)                                               'namjestanje vremena u koraku od 10sIf Value(1) <> 0 Then Value(1) = 10Set Disp_update_flagReturn Key3:Incr Value(2)                                               'namjestanje vremena u koraku od 10sIf Value(1) <> 0 Then Value(1) = 0Set Disp_update_flagReturn	'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Osvjezi display'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Disp_update:If Value(1) > 9 And Value(1) < 100 Then                     '-------------------------------   Value(1) = 0                                             '-                              -   Incr Value(2)                                            '-                              -End If                                                      '-                              -If Value(1) > 100 Then                                      '-                              -   Value(1) = 9                                             '-                              -   Decr Value(2)                                            '-                              -End If                                                      '-                              -If Value(2) > 5 And Value(2) < 100 Then                     '-                              -   Value(2) = 0                                             '-                              -   Incr Value(3)                                            '-                              -End If                                                      'provjera pojedinih vrijednosti -If Value(2) > 100 Then                                      '-                              -   Value(2) = 5                                             '-                              -   Decr Value(3)                                            '-                              -End If                                                      '-                              -If Value(3) > 9 And Value(3) < 100 Then                     '-                              -   Value(3) = 0                                             '-                              -   Incr Value(4)                                            '-                              -End If                                                      '-                              -If Value(3) > 100 Then                                      '-                              -   Value(3) = 9                                             '-                              -   Decr Value(4)                                            '-                              -End If                                                      '-                              -If Value(4) > 9 And Value(4) < 100 Then Value(4) = 0        '-                              -If Value(4) > 100 Then Value(4) = 9                         '-------------------------------- For I = 1 To 4Disp(i) = Lookup(value(i) , Table)                          'cita vrijednosti za 4 displeja definirane u tabliciNext I If Timer1_toggle_flag = 0 Then Set Middle_leds_flag         'omoguci stalno upaljenu dvotocku ako nije ukljuceno odbrojavanjeIf Middle_leds_flag = 1 Then Disp(3) = Disp(3) + 16         'ukljuci dvotocku koja je spojena na DP od treceg displejaIf Value(4) = 0 Then Disp(4) = 0                            'ugasi display 4 ako mu je vrijednost 0 For I = 1 To 4Shiftout Dat , Clock , Disp(i) , 1                          'napuni registre podacimaNext I Set Store                                                   'prebaci podatke iz registara na izlaze cipaReset StoreReset Disp_update_flagIdlee = 0                                                   'ako se vrijednost displeja mjenja, znaciReturn                                                      'uredaj nije u stanju mirovanja	'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Alarm'zvuci otprilike ovako'BIP-BIP-BIP-BIP  BIP-BIP-BIP-BIP  BIP-BIP-BIP-BIP'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Make_noise:For J = 0 To 2For I = 0 To 3Sound Speaker , Pulses , PeriodsWaitms 10Next IWaitms 500Next JSet Read_eeprom_flagReset Make_noise_flagReturn   '++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Citanje i pisanje iz EEPROM-a'sprema i cita sa lokacija 1-4'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Read_eeprom:For I = 1 To 4Readeeprom Value(i) , INext ISet Disp_update_flagReset Read_eeprom_flagReturn Write_eeprom:For I = 1 To 4Writeeeprom Value(i) , INext IReset Write_eeprom_flagReturn	'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Gasenje mikrokontrolera'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Shutdown:For I = 0 To 3Shiftout Dat , Clock , Empty , 1                            'isprazni registre, tj. napuni ih nulamaNext ISet Store                                                   'prebaci podatke iz registara na izlaze cipa (displeji ce biti ugaseni)Reset StoreEnable Int0                                                 'omoguci Interrupt0 kako bi CPU tipkom 1 mogli probuditiStop Timer1                                                 'zaustavi timer1 kako on nebi probudio CPUPowerdown                                                   'gasiBitwait S1 , Set                                            'pritiskom na tipku 1 CPU se ukljucuje, zatim cekaj sve dok se tipka ne otpustiDisable Int0Start Timer1Set Read_eeprom_flagReset Shutdown_flagReturn	'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Timer1 prekidna rutina'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Timer1_int:Incr IdleeIf Timer1_toggle_flag = 1 Then      If Value(1) = 0 And Value(2) = 0 And Value(3) = 0 And Value(4) = 0 Then       'ako je vrijednost 00:00 onda...         Reset Timer1_toggle_flag         Reset Relay         Reset Check_keys_flag         Set Make_noise_flag      End If   Toggle Middle_leds_flag   Set Disp_update_flag   If Middle_leds_flag = 1 Then Decr Value(1)End If If Idlee = 240 Then                                         'ako je CPU neaktivan 2min...   Set Write_eeprom_flag                                    'zapisi stanje timera   Set Shutdown_flag                                        'zatim ugasi CPUEnd IfReturn	'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'------------------------------------------------------------------------------'Tablica brojeva (0-9) za 7-seg display'------------------------------------------------------------------------------'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Table:Data 235 , 96 , 199 , 230 , 108 , 174 , 175 , 224 , 239 , 238
Link spre comentariu

Codul de mai sus este cam complicat, am gasit un cod mai simplu cu schema cu tot, insa este de ceas, as vrea doar sa fac sa functioneze ceasul ca un countdown,minute si secunde, ma ajutati sa modific acest cod?

Il atasez mai jos impreuna cu schema.

Multumesc anticipat.

 

Posted Image

 

 

' µC Deklarationen$regfile = "2313def.dat"                                    'AT90S2313-Deklarationen$crystal = 4000000  ' VariablenDim Temp_ziffer As Byte                 'welche ziffer soll bearbeitet werdenDim Bcd_aus As Byte                     'enthält den Wert der dez zahl die ausgegeben werden soll Dim Ausgang As Byte                     'Segmentfolge die Ausgegeben wird aus Segmentcode - TabelleDim Sek_blink As Bit                    'Blinkt im Sekunden Takt Dim Zl_sekunde As Byte                  'Zeit VariablenDim Zl_minute As Byte                   'enthalten die UhrzeitDim Zl_stunde As Byte                   'Zl-... => Low Wert der ZeitDim Zh_sekunde As Byte                  'Zh-... => High Wert der ZeitDim Zh_minute As ByteDim Zh_stunde As Byte  ' Ein-/AusgängeConfig Portb = Output                    'Port B als AusgangDdrd = &B0111100                         '1 Ausgang, 0 EingangPortd = &B1000011                        '1 = PullUp aktiviert Eingang (Taster gegen Masse) 'Ausgänge:Segment_a Alias Portb.0Segment_b Alias Portb.1Segment_c Alias Portb.2Segment_d Alias Portb.3Segment_e Alias Portb.4Segment_f Alias Portb.5Segment_g Alias Portb.6Dezimalpunkt Alias Portb.7Ziffer_1 Alias Portd.2Ziffer_2 Alias Portd.3Ziffer_3 Alias Portd.4Ziffer_4 Alias Portd.5 'Eingänge:T_min_stellen Alias Pind.0T_h_stellen Alias Pind.1  ' SonstigesConst Load_timer1 = 62755                 'Konstande auf die der Timer1 geladen wird'4MHz = 62755 | 62760 etwas zu langsam <> 62750 etwas zu schnell   '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Timer0 für Multiplexausgabe'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ On Timer0 7segment                      'Interrupt-Routine für Timer0-OverflowConfig Timer0 = Timer , Prescale = 64   'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)Enable Timer0                           'Timer0-Overflow-Interrupt einschalten  '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Timer 1 als Zeitbasis'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ On Timer1 Sekunde_plus                   'Interrupt-Routine für Timer1-OverflowConfig Timer1 = Timer , Prescale = 64    'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)Enable Timer1                            'Timer0-Overflow-Interrupt einschaltenEnable Interrupts                        'Interrupts global zulassenLoad Timer1 , Load_timer1                'Lädt den Timer auf einen wert vor  '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Hauptprogramm'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Do                                                'Start Hauptschleife  ' ### Uhren Code ###' Es wird für jede Ziffer einzelnd gezählt, das ermöglicht eine einfacher ausgabe' auf den 7segmentanzeigen. Der Zählvorgang funktioniert ím prinzip wie z.B.' bei einem normalen Logik Zähler-IC If Zl_sekunde = 10 Then            'Wenn der Sekunden Low Wert = 10Zl_sekunde = 0                     'wird er auf 0 gesetztIncr Zh_sekunde                    'und der High Wert um eins erhöht   If Zh_sekunde = 6 Then          'Ist der High Wert 6 (entspricht 60 Sekunden)   Zh_sekunde = 0                  'wird er auf 0 gesetzt   Incr Zl_minute                  'und der Minuten Low Wert um eins erhöht   End IfEnd If  If Zl_minute = 10 Then   Zl_minute = 0   Incr Zh_minuteEnd IfIf Zh_minute = 6 Then   Zh_minute = 0   Incr Zl_stundeEnd If  If Zl_stunde = 10 Then   Zl_stunde = 0   Incr Zh_stundeEnd IfIf Zh_stunde = 2 And Zl_stunde = 4 Then   Zl_stunde = 0   Zh_stunde = 0End If   ' ### Uhr stellen ###' Wird der Taster "T_min_stellen" betätigt werden die Minuten um eins erhöht.' Wird der Taster "T_h_stellen" betätigt werden die Stunden um eins erhöht.' Werden beide gleichzeitig betätigt werden Stunden und Minuten auf Null gesetzt.' Wird einer der Taster länger betätigt (> 150ms) gibt es einen schnellvorlauf If T_min_stellen = 0 Then                   'Wird "T_min_stellen" betätigt   Waitms 150                               'Entprellen   If T_min_stellen = 0 Then                'Ist der Taster immer noch betätigt   Incr Zl_minute                           'wird Minute um eins erhöht   Zl_sekunde = 0                           'Sekunden auf Null setzen   Zh_sekunde = 0   End IfEnd If  If T_h_stellen = 0 Then    Waitms 150    If T_h_stellen = 0 Then    Incr Zl_stunde    Zl_sekunde = 0    Zh_sekunde = 0    End IfEnd If  If T_min_stellen = 0 And T_h_stellen = 0 Then     'Wenn "T_Min_stellen" und "T_H_stellen" gleichzeitig betätigt    Zl_minute = 0                                 'dann werden Minuten und Stunden auf 0 gestzt    Zh_minute = 0    Zl_stunde = 0    Zh_stunde = 0End If   Loop                                              'Ende Hauptschleife End                                               'Programm Ende  '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige wird' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine Anzeige' weitergeschaltet.'' Anzeigen anordnung'' 1111  2222   3333  4444' 1  1  2  2   3  3  4  4' 1111  2222   3333  4444' 1  1  2  2   3  3  4  4' 1111o 2222o  3333o 4444o''                        ^-- Dezimalpunkt'                      ^---- 4. Ziffer | Minute Low Wert  | Variable Zl_minute'                ^---------- 3. Ziffer | Minute High Wert | Variable Zh_minute'         ^----------------- 2. Ziffer | Stunde Low Wert  | Variable Zl_stunde'   ^----------------------- 1. Ziffer | Stunde High Wert | Variable Zh_stunde  7segment: If Temp_ziffer = 4 Then Temp_ziffer = 0           'bestimmt die auszugebende Ziffer (1 bis 4)Incr Temp_ziffer                                  'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben  Portb = &B11111111                                'Alle Ziffern aus, ansonsten gibt es "Geister" Anzeigen  Select Case Temp_ziffer                           'welche Ziffer soll angesteuert werden   Case 1 : Ziffer_1 = 1                          '1. Ziffer            Ziffer_2 = 0            Ziffer_3 = 0            Ziffer_4 = 0            Bcd_aus = Zh_stunde   Case 2 : Ziffer_1 = 0                          '2. Ziffer            Ziffer_2 = 1            Ziffer_3 = 0            Ziffer_4 = 0            Dezimalpunkt = Sek_blink              'Dezimalpunkt            Bcd_aus = Zl_stunde   Case 3 : Ziffer_1 = 0                          '3. Ziffer            Ziffer_2 = 0            Ziffer_3 = 1            Ziffer_4 = 0            Bcd_aus = Zh_minute   Case 4 : Ziffer_1 = 0                          '4. Ziffer            Ziffer_2 = 0            Ziffer_3 = 0            Ziffer_4 = 1            Bcd_aus = Zl_minuteEnd Select  'Ermittelt aus der Segmentfolge-Tabelle den 7 Segmentcode für die auszugebende ZahlSelect Case Bcd_aus    Case 1 : Ausgang = Lookup(1 , Segmentfolge)    Case 2 : Ausgang = Lookup(2 , Segmentfolge)    Case 3 : Ausgang = Lookup(3 , Segmentfolge)    Case 4 : Ausgang = Lookup(4 , Segmentfolge)    Case 5 : Ausgang = Lookup(5 , Segmentfolge)    Case 6 : Ausgang = Lookup(6 , Segmentfolge)    Case 7 : Ausgang = Lookup(7 , Segmentfolge)    Case 8 : Ausgang = Lookup(8 , Segmentfolge)    Case 9 : Ausgang = Lookup(9 , Segmentfolge)    Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge)   'Nullstellenunterdrückung  bei der ersten Ziffer    Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge)    'wenn nicht erste Ziffer Null anzeigenEnd Select  'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)Segment_a = Not Ausgang.0                         'Segment ASegment_b = Not Ausgang.1                         'Segment BSegment_c = Not Ausgang.2                         'Segment CSegment_d = Not Ausgang.3                         'Segment DSegment_e = Not Ausgang.4                         'Segment ESegment_f = Not Ausgang.5                         'Segment FSegment_g = Not Ausgang.6                         'Segment G  Return  '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Interrupt-Routine für Timer1 / Zeitbasis'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Sekunde_plus:  Load Timer1 , Load_timer1            'Lädt den Timer auf einen wert vor Incr Zl_sekunde                      'Erhöht den Low Wert der Sekunde um eins Toggle Sek_blink                     'Ändert sich jede Sek., 1sec an 1sec aus  Return   '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' 7 Segmentcode - Tabelle'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'' --A--' |   |' F   B' |   |' --G--' |   |' E   C' |   |' --D--  Segmentfolge:                'GFEDCBA / "1" Segment ANData &B0111111               '0Data &B0000110               '1Data &B1011011               '2Data &B1001111               '3Data &B1100110               '4Data &B1101101               '5Data &B1111101               '6Data &B0000111               '7Data &B1111111               '8Data &B1101111               '9Data &B0000000               'leeres Feld (zur Nullstellenunterdrückung) 
Link spre comentariu

Mai intii fa-ti o schema si cablaj, dupa acea treci la soft, poti folosii Attiny2313 daca vrei dar i-ti recomand totusi Atmega8, daca nu ai nevoie de timpi mari (ordinul minutelor) poti folosii ceasul intern altfel pune-i quartz. Foloseste ca exemplu schema de mai jos (dar fa-o mai ordonat), pune pinii asa cum i-ti e mai usor sau cum da mai bine la trasee, o sa faci softul in functie de asta. Din experienta stiu ca te poti descurca cu minim doua butoane insa trei sint mai bune. Foloseste afisaj cu pini comuni, o sa faci economie la trasee si schema o sa fie oarecum mai simpla, ceva de genul CC56-21YWA de la TME, are doua puncte la mijloc care le poti face sa clipeasca sincron cu secundele sau KW4-361XGB un afisaj mai micut .......

st.pdf

Link spre comentariu

Da, atmega 8 o sa folosesc, timpul maxim 99 minute, cred ca e suficient oscilatorul intern. Am reusit la softul de mai sus sa il fac sa mearga inapoi.

Vreau sa implementez 3 sau 4 butoane, 2 dintre ele urca si coboara timpul, iar celelalte unul de oprire si unul de pornire a timpului , daca nu chiar ambele functii pe acelasi buton.

Vreau sa mai implementez in soft:

Cand timpul a expirat, sa imi activeze un buzzer si sa afiseze 00:00 apoi sa nu se opreasca decat daca apas pe butonul de stop/start

Timpul presetat sa se memoreze in eeprom, sa nu setez de fiecare data cand opresc alimentarea.

Mai incerc sa vad ce mai reusesc eu sa fac, si ce nu reusesc o sa pun codul modificat aici.

Multumesc.

Link spre comentariu

Nu am momentan piesele, si nu stiu care le voi achizitiona, ma refer la display, deci in mare parte ramane conectat ca in program, o sa modific eu daca este nevoie.

Dar nu reuseesc sa fac cele spuse mai sus.

Atasez codu modificat, va rog sa ma ajutati sa implementez cele spuse la postul anterior.

 

$regfile = "m8def.dat"                                      'AT90S2313-Deklarationen$crystal = 4000000 ' VariablenDim Temp_ziffer As Byte                 'welche ziffer soll bearbeitet werdenDim Bcd_aus As Byte                     'enthält den Wert der dez zahl die ausgegeben werden soll Dim Ausgang As Byte                     'Segmentfolge die Ausgegeben wird aus Segmentcode - TabelleDim Sek_blink As Bit                    'Blinkt im Sekunden Takt Dim Zl_sekunde As Byte                  'Zeit VariablenDim Zl_minute As Byte                   'enthalten die Uhrzeit Dim Zh_sekunde As Byte                  'Zh-... => High Wert der ZeitDim Zh_minute As ByteDim Preset1 As Word                                             'Variable für den festen WertPreset1 = 270 ' Ein-/AusgängeConfig Portb = Output                                       'Port B als AusgangDdrd = &B0111100                         '1 Ausgang, 0 EingangPortd = &B1000011                        '1 = PullUp aktiviert Eingang (Taster gegen Masse)  'Ausgänge:Segment_a Alias Portb.0Segment_b Alias Portb.1Segment_c Alias Portb.2Segment_d Alias Portb.3Segment_e Alias Portb.4Segment_f Alias Portb.5Segment_g Alias Portb.6Dezimalpunkt Alias Portb.7Ziffer_1 Alias Portd.2Ziffer_2 Alias Portd.3Ziffer_3 Alias Portd.4Ziffer_4 Alias Portd.5 'Eingänge:T_min_stellen Alias Pind.0T_h_stellen Alias Pind.1Pornire Alias Pind.6   ' SonstigesConst Load_timer1 = 62755                                   'Konstande auf die der Timer1 geladen wird'4MHz = 62755 | 62760 etwas zu langsam <> 62750 etwas zu schnell   '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Timer0 für Multiplexausgabe'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ On Timer0 7segment                      'Interrupt-Routine für Timer0-OverflowConfig Timer0 = Timer , Prescale = 64   'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024)Enable Timer0                           'Timer0-Overflow-Interrupt einschalten  '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Timer 1 als Zeitbasis'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  On Timer1 Sekunde_minus                                     'Interrupt-Routine für Timer1-OverflowConfig Timer1 = Timer , Prescale = 64    'Takt: Quarz/Prescale  (möglich: 1, 8, 64, 256, 1024) Enable Timer1                                               'Timer0-Overflow-Interrupt einschalten Enable Interrupts                        'Interrupts global zulassen Load Timer1 , Load_timer1  '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Hauptprogramm'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Do T_set:	If T_min_stellen = 0 Then                                   'Wird "T_min_stellen" betätigt   Waitms 150                               'Entprellen   If T_min_stellen = 0 Then                'Ist der Taster immer noch betätigt   Incr Zl_minute   If Zl_minute = 10 Then       Zl_minute = 0       Incr Zh_minute       If Zh_minute = 10 Then       Zh_minute = 0        Zl_minute = 0                                       'wird Minute um eins erhöht    End IfEnd IfEnd IfEnd If ' ### Uhren Code ###' Es wird für jede Ziffer einzelnd gezählt, das ermöglicht eine einfacher ausgabe' auf den 7segmentanzeigen. Der Zählvorgang funktioniert ím prinzip wie z.B.' bei einem normalen Logik Zähler-IC  Program:   If Zl_sekunde= -1 Then                                                'Wenn der Sekunden Low Wert = 10Zl_sekunde = 9                                              'wird er auf 0 gesetztDecr Zh_sekunde End If                                                      'und der High Wert um eins erhöht   If Zh_sekunde = -1 Then                                  'Ist der High Wert 6 (entspricht 60 Sekunden)   Zh_sekunde = 5                                           'wird er auf 0 gesetzt   Decr Zl_minute                                           'und der Minuten Low Wert um eins erhöht   End If   If Zl_minute = -1 Then   Zl_minute = 9    Decr Zh_minuteEnd IfIf Zh_minute = -1 Then   Zh_minute = 9End If	   ' ### Uhr stellen ###' Wird der Taster "T_min_stellen" betätigt werden die Minuten um eins erhöht.' Wird der Taster "T_h_stellen" betätigt werden die Stunden um eins erhöht.' Werden beide gleichzeitig betätigt werden Stunden und Minuten auf Null gesetzt.' Wird einer der Taster länger betätigt (> 150ms) gibt es einen schnellvorlauf   Loop                                                        'Ende Hauptschleife End                                                         'Programm Ende	'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Interrupt-Routine für Ziffer ausgabe im 7 Segmentcode'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Bei jedem Aufruf wir nur eine Ziffer ausgegeben, d.h nur eine Anzeige wird' angesteuert. Die anderen bleiben dunkel. Bei jedem Aufruf wird eine Anzeige' weitergeschaltet.'' Anzeigen anordnung'' 1111  2222   3333  4444' 1  1  2  2   3  3  4  4' 1111  2222   3333  4444' 1  1  2  2   3  3  4  4' 1111o 2222o  3333o 4444o''                        ^-- Dezimalpunkt'                      ^---- 4. Ziffer | Minute Low Wert  | Variable Zl_minute'                ^---------- 3. Ziffer | Minute High Wert | Variable Zh_minute'         ^----------------- 2. Ziffer | Stunde Low Wert  | Variable Zl_stunde'   ^----------------------- 1. Ziffer | Stunde High Wert | Variable Zh_stunde  7segment: If Temp_ziffer = 4 Then Temp_ziffer = 0           'bestimmt die auszugebende Ziffer (1 bis 4)Incr Temp_ziffer                                  'bei jedem aufruf des Lable wir eine andere Ziffer ausgegeben  Portb = &B11111111                                'Alle Ziffern aus, ansonsten gibt es "Geister" Anzeigen  Select Case Temp_ziffer                           'welche Ziffer soll angesteuert werden   Case 1 : Ziffer_1 = 1                          '1. Ziffer            Ziffer_2 = 0            Ziffer_3 = 0            Ziffer_4 = 0            Bcd_aus = Zh_minute   Case 2 : Ziffer_1 = 0                          '2. Ziffer            Ziffer_2 = 1            Ziffer_3 = 0            Ziffer_4 = 0            Dezimalpunkt = Sek_blink              'Dezimalpunkt            Bcd_aus = Zl_minute   Case 3 : Ziffer_1 = 0                          '3. Ziffer            Ziffer_2 = 0            Ziffer_3 = 1            Ziffer_4 = 0            Bcd_aus = Zh_sekunde   Case 4 : Ziffer_1 = 0                          '4. Ziffer            Ziffer_2 = 0            Ziffer_3 = 0            Ziffer_4 = 1            Bcd_aus = Zl_sekundeEnd Select  'Ermittelt aus der Segmentfolge-Tabelle den 7 Segmentcode für die auszugebende ZahlSelect Case Bcd_aus    Case 1 : Ausgang = Lookup(1 , Segmentfolge)    Case 2 : Ausgang = Lookup(2 , Segmentfolge)    Case 3 : Ausgang = Lookup(3 , Segmentfolge)    Case 4 : Ausgang = Lookup(4 , Segmentfolge)    Case 5 : Ausgang = Lookup(5 , Segmentfolge)    Case 6 : Ausgang = Lookup(6 , Segmentfolge)    Case 7 : Ausgang = Lookup(7 , Segmentfolge)    Case 8 : Ausgang = Lookup(8 , Segmentfolge)    Case 9 : Ausgang = Lookup(9 , Segmentfolge)    Case 0 And Temp_ziffer = 1 : Ausgang = Lookup(10 , Segmentfolge)   'Nullstellenunterdrückung  bei der ersten Ziffer    Case 0 And Temp_ziffer > 1 : Ausgang = Lookup(0 , Segmentfolge)    'wenn nicht erste Ziffer Null anzeigenEnd Select  'Ausgabe des 7 Segmentcodes (Invertierend [Not] bei Anz. mit gem. Anode)Segment_a = Not Ausgang.0                         'Segment ASegment_b = Not Ausgang.1                         'Segment BSegment_c = Not Ausgang.2                         'Segment CSegment_d = Not Ausgang.3                         'Segment DSegment_e = Not Ausgang.4                         'Segment ESegment_f = Not Ausgang.5                         'Segment FSegment_g = Not Ausgang.6                         'Segment G  Return  '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' Interrupt-Routine für Timer1 / Zeitbasis'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++  Sekunde_minus:  Load Timer1 , Load_timer1            'Lädt den Timer auf einen wert vor Decr Zl_sekunde                                             'Erhöht den Low Wert der Sekunde um eins Toggle Sek_blink                                            'Ändert sich jede Sek., 1sec an 1sec aus Return   '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++' 7 Segmentcode - Tabelle'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++'' --A--' |   |' F   B' |   |' --G--' |   |' E   C' |   |' --D--  Segmentfolge:                'GFEDCBA / "1" Segment ANData &B0111111               '0Data &B0000110               '1Data &B1011011               '2Data &B1001111               '3Data &B1100110               '4Data &B1101101               '5Data &B1111101               '6Data &B0000111               '7Data &B1111111               '8Data &B1101111               '9Data &B0000000               'leeres Feld (zur Nullstellenunterdrückung)   
Link spre comentariu

Am rezolvat in cea mai mare parte problema cu timer.

 

Acum am o alta problema, asta este de vreo 2 ani, nu am mai apucat sa o fac.

Se da un atmega8 SMD, deci are 8 porturi ADC, vreau ca 2 butoane sa comute ADC-urile astfel incat sa afiseze tensiunea de pe fiecare port pe un singur LCD.

Deci buton 1 sa fie UP si buton 2 Down pentru ADC-uri

 Ma puteti ajuta cu acea parte de cod? stiu cum sa configurez astfel incat atunci cand apas butonul, cat timp e apasat afiseaza tensiunea de pe un port, cand este liber de pe alt port, dar cum vreu eu, nu gasesc explicatii.

Multumesc.

Link spre comentariu
doif buton_up = 0 then a = a + 1if a > nr_of_analog_in then a = 0 'faci testul de "prea mare" dupa, ca un caracter merge pana la 255if buton_down = 0 then  if a > 0 then 'faci testul de "prea mic" inainte sa decrementezi, ca daca e unsigned, o ia de la 255    a = a - 1 else   a = nr_of_analog_in endifendifif a = 0 then b = getadc(0)if a = 1 then b = getadc(1)if...locate ..........lcd bwaitms 100loop
PS Am modificat codul din postul lui nickrvl Editat de Liviu M
Link spre comentariu

Am incercat sa implementez codul de mai sus, insa nu reusesc,  nu stiu ce trebuie sa pun la "nr of analog in", pun mai jos codul si daca puteti sa imiimplementati pentru 2 adc-uri, restul le fac eu.

Multumesc.

 

 

$regfile = "m8def.dat"$crystal = 4000000 Config Portb = OutputConfig Portd = OutputConfig Adc = Single , Prescaler = AutoConfig Portd.6 = InputConfig Portd.7 = Input Set Portd.6Set Portd.6 Buton_up Alias Pind.6Buton_down Alias Pind.7  Start Adc Dim Read_adc As WordDim Volt As SingleDim Volt1 As IntegerDim Bit4 As IntegerDim Bit3 As IntegerDim Bit2 As IntegerDim Bit1 As IntegerDim B1 As Byte	Do	   Read_adc = Getadc(0)Volt = Read_adc / 1023Volt = Volt * 30Volt = Volt * 100Volt1 = Volt		   Bit4 = Volt1 / 1000B1 = Lookup(bit4 , Dta)Portd = &B00001000Portb = B1 Bit3 = Volt1 / 100Bit3 = Bit3 Mod 10B1 = Lookup(bit3 , Dta)Portd = &B00000100Portb = B1 Bit2 = Volt1 / 10Bit2 = Bit2 Mod 10B1 = Lookup(bit2 , Dta)Portd = &B00000010Portb = B1 Bit1 = Volt1 Mod 10B1 = Lookup(bit1 , Dta)Portd = &B00000001Portb = B1Loop Dta:Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00
Link spre comentariu

Nu vad sa fi incercat ceva, Getadc este tot 0 sau 1 ..... dai valoare portului ADC dintr-o variabila, "a" de exemplu.

Getadc(a)

Acest "a" poate lua valori intre 0 si 8, in cazul tau, din butoane.

 

if buton_up = 0 and a< 8 then a = a + 1

if buton_down = 0 and a >= 0  then a = a - 1

 

trebuie alocata memorie pentru variabila "a", probabil  Dim a as Byte.....

 

Teoretic acum din butoane valoarea va creste cind se apasa "buton_up" pina la maxim 8 iar la apasarea "buton_down" va scadea pina la 0 inclusiv, insa nu am testat scriu din memorie....

 

 

In concluzie incearca astfel:

 

$regfile = "m8def.dat"$crystal = 4000000 Config Portb = OutputConfig Portd = OutputConfig Adc = Single , Prescaler = AutoConfig Portd.6 = InputConfig Portd.7 = Input Set Portd.6Set Portd.6 Buton_up Alias Pind.6Buton_down Alias Pind.7 Start Adc Dim Read_adc As WordDim Volt As SingleDim Volt1 As IntegerDim Bit4 As IntegerDim Bit3 As IntegerDim Bit2 As IntegerDim Bit1 As IntegerDim B1 As Byte

Dim a as Byte

a = 0 Do

if buton_up = 0 and a< 8 then a = a + 1

if buton_down = 0 and a >= 0  then a = a - 1

 Read_adc = Getadc(a)Volt = Read_adc / 1023Volt = Volt * 30Volt = Volt * 100Volt1 = Volt Bit4 = Volt1 / 1000B1 = Lookup(bit4 , Dta)Portd = &B00001000Portb = B1 Bit3 = Volt1 / 100Bit3 = Bit3 Mod 10B1 = Lookup(bit3 , Dta)Portd = &B00000100Portb = B1 Bit2 = Volt1 / 10Bit2 = Bit2 Mod 10B1 = Lookup(bit2 , Dta)Portd = &B00000010Portb = B1 Bit1 = Volt1 Mod 10B1 = Lookup(bit1 , Dta)Portd = &B00000001Portb = B1Loop Dta:Data &H40 , &H79 , &H24 , &H30 , &H19 , &H12 , &H02 , &H78 , &H00

Editat de nickrvl
Link spre comentariu

Functioneaza partial, cand pornesc in simulator, proteus 8.3, imi afiseaza tensiunea de pe ADC.0, cand apas pe buton_up afiseaza 0000, desi ar trebui sa afiseze tensiunea de pe ADC.1, daca apas pe buton_down, nu mai revine, si daca mai revine afiseaza hieroglife..

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări