costyy86 Postat Februarie 17, 2016 Partajează Postat Februarie 17, 2016 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? $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
costyy86 Postat Februarie 23, 2016 Partajează Postat Februarie 23, 2016 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. ' µ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
nickrvl Postat Februarie 23, 2016 Partajează Postat Februarie 23, 2016 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
costyy86 Postat Februarie 23, 2016 Partajează Postat Februarie 23, 2016 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
costyy86 Postat Februarie 24, 2016 Partajează Postat Februarie 24, 2016 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
costyy86 Postat Februarie 25, 2016 Partajează Postat Februarie 25, 2016 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
nickrvl Postat Februarie 25, 2016 Partajează Postat Februarie 25, 2016 doif buton_up = 0 then a = 0if buton_down = 0 then a = 1if a = 0 then b = getadc(0)if a = 1 then b = getadc(1)locate ..........lcd awaitms 100loop Link spre comentariu
costyy86 Postat Februarie 25, 2016 Partajează Postat Februarie 25, 2016 Bun, din ce vad eu un buton activeaza un port iar celalalt alt port., dar cum pot din acelasi buton "if buton_up" sa selectez cu fiecare apasare toate porturile pe rand ADC0....ADC7? Link spre comentariu
Liviu M Postat Februarie 25, 2016 Partajează Postat Februarie 25, 2016 (editat) 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 100loopPS Am modificat codul din postul lui nickrvl Editat Februarie 25, 2016 de Liviu M Link spre comentariu
costyy86 Postat Februarie 26, 2016 Partajează Postat Februarie 26, 2016 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
nickrvl Postat Februarie 26, 2016 Partajează Postat Februarie 26, 2016 (editat) 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 Februarie 26, 2016 de nickrvl Link spre comentariu
costyy86 Postat Februarie 26, 2016 Partajează Postat Februarie 26, 2016 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
nickrvl Postat Februarie 26, 2016 Partajează Postat Februarie 26, 2016 Nu stiu cit de reala e simularea, nu de putine ori am constatat ca pe placi de dezvoltare, de proba, sa functioneze corect fata de simulare. Link spre comentariu
costyy86 Postat Februarie 26, 2016 Partajează Postat Februarie 26, 2016 Ok. O sa incerc cand imi ajung piesele. Multumesc. Link spre comentariu
Elison Postat Februarie 26, 2016 Partajează Postat Februarie 26, 2016 Pana iti vin piesele, ai aici un exemplu scris de mine care functioneaza si face exact ce vrei tu, dar pe un display LCD. ADC.rar Link spre comentariu
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum