costyy86 Postat Iunie 1, 2014 Partajează Postat Iunie 1, 2014 Voi folosi Atmega8 SMD, are 8 canale dupa cum spune si @Depanatorul. Am mai vazut un exeplu de cod, cu conditionare "IF" dar nu il mai gases, practic, nu stiu cum sa fac conditionarea, un exemplu ar fi foarte bun...o sa mai rasfoiesc helpul bascomului, poate reusesc sa dau de cap. Link spre comentariu
Depanatoru Postat Iunie 1, 2014 Partajează Postat Iunie 1, 2014 (editat) Pai cam asa IF canal0 = 0 THEN Getadc(0) ... aici faci citirea si ce mai trebuie sa faciEND IF canal0 ... 7 sunt "alias" pentru pinii ce vin la comutatorul rotativ. Se presupune ca sunt activate pull up-urile interne si comutatorul pune pinul corespunzator la masa Si tot asa pentru cele 8 canale ADC Editat Iunie 1, 2014 de Depanatoru Link spre comentariu
costyy86 Postat Iunie 1, 2014 Partajează Postat Iunie 1, 2014 Ok. Am priceput, dupa ce o sa sa scriu o parte din program, o sa simulez sa vad ce iese. Multumesc. Link spre comentariu
nico_2010 Postat Iunie 2, 2014 Partajează Postat Iunie 2, 2014 Voi folosi Atmega8 SMD, are 8 canale dupa cum spune si @Depanatorul. Asa se intampla cand nu exprimi ideea pana la capat. Poti citi toate intrarile ADC intr-o bucla For...Next si apoi, functie de pinul de intrare (butonul apasat) sa folosesti valoarea analogica aferenta. Link spre comentariu
luk68 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Imi exprim disponibilitatea de a furniza celor interesati un curs de programare folosind platforma BASCOM-AVR. As dori si eu acel fisier daca se poate. [email protected] Multumesc frumos. Link spre comentariu
costyy86 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Vreau sa fac un termometru auto cu atmega8 si lcd 16x2 care sa afiseze temperatura interioara si exterioara. Iluminarea displayului doresc sa o fac in timp ce porneste masina sa se ilumineze displayu, si sa implementez un switch pe care sa se apese cand masia este oprita si sa stea luminat cateva secunde dupa care sa se stinga. Codul este ok insa as vrea ca pentru iluminat sa folosesc un timer,astfel ca displayul sa lumineze de la 0 la 1024 si sa se stinga de la 1024 la 0 dupa 8 secunde.. Am scris un cod insa imi apar hieroglife, nu am ami folosit functia timerului pana acum si nu prea stiu cm sa o configurez. Pun mai jos partea de cod la care nu ma descurc, sa va dati cu parerea... Eu cred ca acest cod "Compare A Pwm = Clear Down" ar avea ceva vina... $regfile = "m8def.dat"$crystal = 1000000 $hwstack = 32$swstack = 10$framesize = 40Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1Config Portd.4 = InputSet Portd.4Light Alias Pind.4Config Lcdpin = Pin , Rs = Portb.7 , E = Portd.6 , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2Config Lcd = 16 * 2........................... If Light = 1 ThenCompare1a = 100Waitms 100Compare1a = 200Waitms 100Compare1a = 300Waitms 100Compare1a = 400Waitms 100Compare1a = 500Waitms 100Compare1a = 600Waitms 100Compare1a = 700Waitms 100Compare1a = 800Waitms 100Compare1a = 900Waitms 100Compare1a = 1024Wait 8Compare1a = 900Waitms 100Compare1a = 800Waitms 100Compare1a = 700Waitms 100Compare1a = 600Waitms 100Compare1a = 500Waitms 100Compare1a = 400Waitms 100Compare1a = 300Waitms 100Compare1a = 200Waitms 100Compare1a = 100Waitms 100Compare1a = 0Waitms 100End If Loop End Link spre comentariu
nico_2010 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Pune tot programul, sau cel putin parte care lipseste Link spre comentariu
costyy86 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Este tot mai jos.. $regfile = "m8def.dat"$crystal = 1000000 $hwstack = 32$swstack = 10$framesize = 40Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1Config Portd.4 = InputSet Portd.4Light Alias Pind.4Config Lcdpin = Pin , Rs = Portb.7 , E = Portd.6 , Db4 = Portd.7 , Db5 = Portb.0 , Db6 = Portb.1 , Db7 = Portb.2Config Lcd = 16 * 2 Deflcdchar 0 , 7 , 15 , 30 , 28 , 28 , 28 , 28 , 32 ' replace [x] with number (0-7)Deflcdchar 1 , 28 , 28 , 28 , 30 , 31 , 15 , 7 , 32 ' replace [x] with number (0-7)Deflcdchar 2 , 32 , 32 , 7 , 15 , 31 , 30 , 28 , 32 ' replace [x] with number (0-7)Deflcdchar 3 , 28 , 30 , 31 , 15 , 7 , 32 , 32 , 32 ' replace [x] with number (0-7) Cursor Off NoblinkClsDim Adcv0 As Word , Temp0 As SingleDim Adcv1 As Word , Temp1 As Single Const Dif = 5 / 1024Const Volt0_div = 0.01Const Volt1_div = 0.01 Config Adc = Single , Prescaler = Auto , Reference = Avcc If Light = 0 ThenStart AdcDoWaitms 300Adcv0 = Getadc(4)Temp0 = Adcv0 * DifTemp0 = Temp0 / Volt0_divTemp0 = Temp0 - 273Locate 1 , 1Lcd "IN"Locate 1 , 4Lcd Fusing(temp0 , "##.#") Adcv1 = Getadc(5) Temp1 = Adcv1 * Dif Temp1 = Temp1 / Volt1_div Temp1 = Temp1 - 273 Locate 2 , 1 Lcd "EX" Locate 2 , 4 Lcd Fusing(temp1 , "##.#") Locate 1 , 8 Lcd Chr(0) Locate 2 , 8 Lcd Chr(1) Locate 2 , 9 Lcd Chr(2) Locate 1 , 9 Lcd Chr(3)End If If Light = 1 ThenCompare1a = 100Waitms 100Compare1a = 200Waitms 100Compare1a = 300Waitms 100Compare1a = 400Waitms 100Compare1a = 500Waitms 100Compare1a = 600Waitms 100Compare1a = 700Waitms 100Compare1a = 800Waitms 100Compare1a = 900Waitms 100Compare1a = 1024Wait 8Compare1a = 900Waitms 100Compare1a = 800Waitms 100Compare1a = 700Waitms 100Compare1a = 600Waitms 100Compare1a = 500Waitms 100Compare1a = 400Waitms 100Compare1a = 300Waitms 100Compare1a = 200Waitms 100Compare1a = 100Waitms 100Compare1a = 0Waitms 100End If Loop End Link spre comentariu
nico_2010 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Prima observatie: tu ai vrut sa conectezi asa afisorul LCD (PORTD si PORTB), nu de alta dar PORTB.7 nu prea exista pe ATMega8. Probabil ai conectat pinul RS al LCD-ului la PORTD.5, dar nu ai facut modificarea in soft. Urmeaza mai tarziu si alte observatii. Link spre comentariu
costyy86 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Scuze, iarasi am uitat sa specific, am atmega8TQFP32, deci are acel port, si am conectat lcd la PORTB.1 care de fapt este iesirea catre ledul cu pricina, am modificat si e mai ok, apare tot pe lcd normal, insa in proteus, ca nu am momentan cum sa testez live,ledul lumineaza intermitent, nicidecum nu creste intensitatea, nu sta 8 secunde si nu scade iarasi intensitatea pana la zero. Nu cumva trebuie pus ceva dupa fiecare comanda de asteptare? Compare1a = 100Waitms 100AICI...Compare1a = 200Waitms 100AICI....Compare1a = 300Waitms 100AICI....Compare1a = 400Waitms 100etc.... Link spre comentariu
nico_2010 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Incearca asa cum este prezentat in schema atasata, cu mentiunea ca am modificat putin programul. Si codul, la prima strigare, fara pretentii de eleganta: $regfile = "m8def.dat"$crystal = 1000000 $hwstack = 32$swstack = 10$framesize = 40Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1Config Pind.4 = InputLight Alias Pind.4Config Portb = OutputPortb = 255Config Lcdpin = Pin , Rs = Portd.5 , E = Portd.6 , Db4 = Portd.0 , Db5 = Portd.1 , Db6 = Portd.2 , Db7 = Portd.3Config Lcd = 16 * 2 Deflcdchar 0 , 7 , 15 , 30 , 28 , 28 , 28 , 28 , 32 ' replace [x] with number (0-7)Deflcdchar 1 , 28 , 28 , 28 , 30 , 31 , 15 , 7 , 32 ' replace [x] with number (0-7)Deflcdchar 2 , 32 , 32 , 7 , 15 , 31 , 30 , 28 , 32 ' replace [x] with number (0-7)Deflcdchar 3 , 28 , 30 , 31 , 15 , 7 , 32 , 32 , 32 ' replace [x] with number (0-7)Compare1a = 100'Compare1b = 200Cursor Off NoblinkClsDim Adcv0 As Word , Temp0 As SingleDim Adcv1 As Word , Temp1 As SingleConst Dif = 5 / 1024Const Volt0_div = 0.01Const Volt1_div = 0.01Config Adc = Single , Prescaler = Auto , Reference = AvccStop Timer1Start AdcDo'Waitms 300If Light = 0 ThenAdcv0 = Getadc(4)Temp0 = Adcv0 * DifTemp0 = Temp0 / Volt0_divTemp0 = Temp0 - 273Locate 1 , 1Lcd "IN"Locate 1 , 4Lcd Fusing(temp0 , "##.#") Adcv1 = Getadc(5) Temp1 = Adcv1 * Dif Temp1 = Temp1 / Volt1_div Temp1 = Temp1 - 273 Locate 2 , 1 Lcd "EX" Locate 2 , 4 Lcd Fusing(temp1 , "##.#") Locate 1 , 8 Lcd Chr(0) Locate 2 , 8 Lcd Chr(1) Locate 2 , 9 Lcd Chr(2) Locate 1 , 9 Lcd Chr(3)End If If Light = 1 ThenStart Timer1Compare1a = 100Waitms 500Compare1a = 200Waitms 500Compare1a = 300Waitms 500Compare1a = 400Waitms 500Compare1a = 500Waitms 500Compare1a = 600Waitms 500Compare1a = 700Waitms 500Compare1a = 800Waitms 500Compare1a = 900Waitms 500Compare1a = 1024'Wait 8Compare1a = 900Waitms 500Compare1a = 800Waitms 500Compare1a = 700Waitms 500Compare1a = 600Waitms 500Compare1a = 500Waitms 500Compare1a = 400Waitms 500Compare1a = 300Waitms 500Compare1a = 200Waitms 500Compare1a = 100Waitms 500Compare1a = 0Waitms 500 Stop Timer1End If Loop End Link spre comentariu
costyy86 Postat Iunie 24, 2014 Partajează Postat Iunie 24, 2014 Multumesc. Functiona si la mine, dar aveam pc prea incarcat si nu facea fata .... Link spre comentariu
yo6pir Postat Iunie 25, 2014 Partajează Postat Iunie 25, 2014 Prima observatie: tu ai vrut sa conectezi asa afisorul LCD (PORTD si PORTB), nu de alta dar PORTB.7 nu prea exista pe ATMega8. Ar trebui sa citesti cu atentie datasheet-ul lui Atmega8 sa vezi ca terminalul 10 (capsula PDIP) este PORTB.7 Scuze, iarasi am uitat sa specific, am atmega8TQFP32, deci are acel port... Nu conteaza ce capsula are Atmega8; toate au portul B.7 in comun cu "XTAL2/TOSC2" si se poate folosi ca atare in configuratia cu oscillator intern, setata corespunzator din fusebiti. Link spre comentariu
nico_2010 Postat Iunie 25, 2014 Partajează Postat Iunie 25, 2014 @yo6pir si costyy86: in mod obisnuit nu folosesc microcontrollere setate cu ceas intern, ci doar cu oscilator extern cu quartz, ca urmare ignor cele doua porturi si mi se pare neuzual sa le folosesc. Link spre comentariu
yo6pir Postat Iunie 25, 2014 Partajează Postat Iunie 25, 2014 (editat) OK, de acord, dar asta nu justifica afirmatia ca: "nu prea exista (Portb.7) pe atmega8". Editat Iunie 25, 2014 de yo6pir 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