Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


ole

Postări Recomandate

Vizitator Deles

Buna seara,Precizez de la inceput ca sunt incepator si sper sa nu deranjez cu intrebari plictisitoare sau stupide ..... dar asa invatam toti. As dorii daca ma poate ajuta cineva cu o schema de legaturi de la un Atmega8( sau oricare din familia Atmega) la o memorie eprom 24C32(sau alta de gen 24CXX)si dac se poate si o secventa de cod pentru memorarea unei variabile in 24C32(nu in epromul din Atmega) , citirea ei si afisarea pe un LCD. Rugamintea mea este daca se poate codul sa fie in Bascom deoarece am inceput sa invat programarea cu el, C-ul ma depaseste momentan :jytuiyu Cu multumiri, Florian.

Link spre comentariu
Vizitator Deles

Multumesc mult pentru ajutorAm incercat schema se pare ca este ok , dar a intervenit alta problema.Codul l-am transformat pentru un Atmega16 (asta l-am avut disponibil ) iar memoria am folosit un 24C32, toate bune si frumoase ,dar se pare ca nu imi scrie in eprom iata si codul pe care l-am folosit poate am gresit eu la ceva , sau trebiue sa mai modific ceva si la fusebit , atmega e default .========================= COD 24C32A =============================$regfile = "m16def.dat"$crystal = 8000000Config Portb.2 = OutputConfig Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7Config Lcd = 16 * 2 , Chipset = Dogm162v5ClsSound Portb.2 , 800 , 20 Config Scl = Portc.0 Config Sda = Portc.1Dim X As ByteDim A As WordDim B As WordDim Schreiben As ByteDim Lesen As ByteDim Adresse As Word At $160 'Die Adresse als Word-VariableDim Low_adresse As Byte At $160 Overlay 'Zeiger auf das erste ByteDim High_adresse As Byte At $161 Overlay 'Zeiger auf das zweite Byte'===================Hauptprogramm===============================================Do'----schreiben----For Adresse = 250 To 259 'Adresse geht über die Byte-GrenzeIncr X '1 bis ÜberlaufI2cstart 'StartI2cwbyte &HA0 'Sende SlavadresseI2cwbyte High_adresse 'Sende Speicheradresse HighI2cwbyte Low_adresse 'Sende Speicheradresse LOWI2cwbyte X 'Sende WertI2cstop 'stopWaitms 10Locate 1 , 1Lcd "->Adr=" ; Adresse ; " X=" ; X ; " " 'Anzeige vom schreibenWaitms 100Next Adresse'---lesen----For Adresse = 250 To 260I2cstart 'StartI2cwbyte &HA0 'Sende Slavadresse +1 für SchreibenI2cwbyte High_adresse 'Sende Speicheradresse HighI2cwbyte Low_adresse 'Sende Speicheradresse LowI2cstart 'StartI2cwbyte &HA1 'Sende Slavadresse +1 für LesenI2crbyte Lesen , Nack 'Lese Adresse vom EEpromI2cstop 'StopLocate 2 , 1Lcd "<-Adr=" ; Adresse ; " L=" ; Lesen ; " " 'Anzeige vom lesenWaitms 100Next AdresseLoopEndpe afisaj apare L = 255 incontinu Va rog ajutatima

Link spre comentariu

In data sheet la pagina 12 la random read ai explicat ce trebuie sa faci ca sa citesti. Eu as folosii random read, unde trebuie sa ii zic eu adresa de unde sa citeasca.In codul tau nu mi se pare ok treaba cu cititu. Trimit start, adresa, comanda de write, adresa din memroie pe 13biti, start di nou, adresa cu comanda read si primesti cei 8 biti de date.Modifica codul tau sa indeplineasca asta si apoi mai vedem.

Link spre comentariu
  • 3 săptămâni mai târziu...
Vizitator dooctoor

De ceva timp am inceput sa studiez programarea micrcocontrolerelor din necesitati practice si m-am intilnit cu niste probleme pe care singur nu le pot descurca, folosesc Mega81) De ce nu se genereaza intreruperea Overflow Timer0 cind folosesc sursa de tact din exterior (cu CK intern functioneaza ), sau nu e posibila asa intrerupere ?2) Am configurat Timer1 in asa mod ca sa am o intrerupere Compare Match la o anumita valoare..(acum doar experimentez pentru o aplicatie) iar intreruperea se genereaza peste citeva tacte fara sa ajunga la valoarea OCR1=xxx, face salt la vectorul intreruperei (rjmp TIM1_COMPA ; Timer1 CompareA Handler), se trateaza subrutina, se returneaza la vectorul intreruperei...si iar sare la subruina...poate eu ceva nu am configurat corect..prezint codul in ASM . In urmatorul tact face salt la vectorul intrerupere..Flagul pentru cererea de intrerupere OCF1A se activeaza de la sine...dupa ce am configurat TCCR1A; Program : starter; Device : Mega8; Description : 1 bloc; Last Updated : 14 august; Author : dooctoor.device mega8.include "m8def.inc" .def temp=r16.def temp1=r17.def temp2=r18.def temp3=r19.def COUNT=R20.cseg rjmp RESET ; Reset Handler ;rjmp EXT_INT0 ; IRQ0 Handler RETI ;rjmp EXT_INT1 ; IRQ1 Handler RETI ;rjmp TIM2_COMP ; Timer2 Compare Handler RETI ;rjmp TIM2_OVF ; Timer2 Overflow Handler RETI ;rjmp TIM1_CAPT ; Timer1 Capture Handler RETI rjmp TIM1_COMPA ; Timer1 CompareA Handler RETI ;rjmp TIM1_COMPB ; Timer1 CompareB Handler RETI ;rjmp TIM1_OVF ; Timer1 Overflow Handler RETI ;rjmp TIM0_OVF ; Timer0 Overflow Handler RETI ;rjmp SPI_STC ; SPI Transfer Complete Handler RETI ;rjmp USART_RXC ; USART RX Complete Handler RETI ;rjmp USART_UDRE ; UDR Empty Handler RETI ;rjmp USART_TXC ; USART TX Complete Handler RETI ;rjmp ADC ; ADC Conversion Complete Handler RETI ;rjmp EE_RDY ; EEPROM Ready Handler RETI ;rjmp ANA_COMP ; Analog Comparator Handler RETI ;rjmp TWSI ; Two-wire Serial Interface RETI.ORG 20RESET: ldi temp,low(RamEnd) out SPL,temp ldi temp,high(RamEnd) out SPH,temp ;----------------------------------------------------------------------------------- LDI TEMP,(1<<1)|(1<<2)|(1<<3) ; PB1,2,3 - OUT OUT DDRB,TEMP LDI TEMP,(0<<0) ;PB0 - INPUT OUT DDRB,TEMP CLR TEMP OUT PORTB,TEMP ;----------------------------------------------------------------------------------- LDI TEMP,(1<

Link spre comentariu
Vizitator AEMelectronic

Am facut urmatorul montaj , http://avrprojects.net/images/LCD%20The ... 35_sch.jpg + cod http://avrprojects.net/attachments/arti ... 20LM35.bas

exista insa o mica problema, nu am gasit LM35 doar LM35DZ

termometru arata cam cu 5.5-6 grade mai mult decat temperatura reala

as vrea sa il fac sa masoare si temperaturi negative

da stiu, nici codul nu e conceput pt temp negative, nici LM nu masoara temperaturi negative ,dar am vazut pe net ca sunt care au facut LM35DZ sa masoare temperaturi cu -

ma poate ajuta cineva prima data sa il fac sa masoare temperatura normala fara erori?

apoi poate si cea cu -

Link spre comentariu

Cele care măsoară şi temperaturi negative sînt LM335. Diferenţa de cîteva grade provine din referinţa ADC-ului, adică tensiunea de alimentare. În mod sigur nu e fix 5,000V.

Link spre comentariu

@dooctoor:

Ceea ce tie ti se pare a fi generare de intrerupere cu clock intern este de fapt actiunea watchdog a microcontrollerului.

Pentru a activa intreruperea aferenta Overflow Timer0 ar trebui sa indepartezi semnul de punctuatie ";" de aici:

;rjmp TIM0_OVF ; Timer0 Overflow Handler

RETI

In ceea ce priveste comportamentul anormal al intreruperii generate de Compare Match, ar trebui sa dezactivezi flagul "Global Interrupt Enable" (prin instructiunea "cli") in subrutina de tratare a intreruperii si sa il activezi la iesirea din aceasta subrutina.

Link spre comentariu
Vizitator AEMelectronic

Cele care măsoară şi temperaturi negative sînt LM335. Diferenţa de cîteva grade provine din referinţa ADC-ului, adică tensiunea de alimentare. În mod sigur nu e fix 5,000V.

te asigur eu ca sunt fix 5Vam alimentat si din sursa + stabilizator si din acumulator+stabilizator
Link spre comentariu

Nu am facut nimic cu atmeluri asa ca nu pot ajuta la cod, da' din cate am vazut in data-sheetul lui LM35 acesta poate masura temperaturi negative daca i se modifica modifica referinta. In data sheet e data o schema cu 2 diode intre referinta LM-ului si masa.

Tensiunea la iesirea LM-ului se va plimba tot intre 5V si masa, da' tensiunile mai mici decat tensiunea lui de referinta (caderea de tensiune pe cele 2 diode, ~2*0.7V=~1.4V) reprezinta temperaturile negative.

Pentru calibrare trebuie masurata tensiunea exacta a referintei LM-ului si folosita in calculele din controller la calcularea temperaturii. Sau si mai elegant se foloseste o alta intrare ADC pentru a masura valoarea direct cu controllerul.

Link spre comentariu

Cele care măsoară şi temperaturi negative sînt LM335. Diferenţa de cîteva grade provine din referinţa ADC-ului, adică tensiunea de alimentare. În mod sigur nu e fix 5,000V.

te asigur eu ca sunt fix 5Vam alimentat si din sursa + stabilizator si din acumulator+stabilizator
Incearca varianta de mai jos:
' ***************************************************************************' *' * Title         : LCD Thermometer LM35.bas' * Version       : 1.0' * Last Updated :  17.04.2006' * Target        : AT Mega8' * Author        : www.avrprojects.net' * Program code  : BASCOM AVR' * Hardware req. : LM35' * Description   : read analog value from LM 35 temperature sensor, show the result on a LCD' *                 display with bar-graph' ***************************************************************************$regfile = "M8def.dat"                                      ' use the Mega8$crystal = 10000000'$simDeflcdchar 0 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32        ' replace ? with number (0-7)'Deflcdchar 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1                ' replace ? with number (0-7)Deflcdchar 2 , 16 , 16 , 16 , 16 , 16 , 16 , 16 , 16        ' replace ? with number (0-7)Deflcdchar 3 , 16 , 16 , 31 , 31 , 31 , 31 , 16 , 16        ' replace ? with number (0-7)Deflcdchar 4 , 1 , 1 , 31 , 31 , 31 , 31 , 1 , 1            ' replace ? with number (0-7)Deflcdchar 5 , 32 , 32 , 28 , 28 , 28 , 28 , 32 , 32        ' replace ? with number (0-7)Config Lcdpin = Pin , Db4 = Portd.3 , Db5 = Portd.2 , Db6 = Portd.1 , Db7 = Portd.0 , E = Portd.6 , Rs = Portd.7Config Lcd = 20 * 4Config Adc = Single , Prescaler = Auto , Reference = Internal       'config ADCStart AdcDim W As Word , Perc As Word , Volt As Integer , Volt_d As Integer , Channel As Byte , I As Byte , Cols As Byte , Cols_d As ByteClsCursor OffLocate 3 , 1Lcd "0"Locate 3 , 5Lcd "10"Locate 3 , 10Lcd "20"Locate 3 , 15Lcd "30"Locate 3 , 19Lcd Chr(223) ; "C"Do  W = Getadc(0)  Volt = W * 2.5  Volt_d = Volt Mod 10  Volt = Volt / 10  Locate 1 , 1  Lcd Volt ; "," ; Volt_d  Cols = Volt / 2  Locate 2 , 1  For I = 1 To Cols   Select Case I   Case 1 : Lcd Chr(3)   Case 5 : Lcd Chr(4)   Case 10 : Lcd Chr(4)   Case 15 : Lcd Chr(4)   Case 20 : Lcd Chr(4)   Case Else : Lcd Chr(0)  End Select  Next I  Cols_d = Cols Mod 2  If Cols_d > 0 Then  Lcd Chr(5)  Cols = Cols + 2  Else  Cols = Cols + 1 End If  For I = Cols To 20  Select Case I   Case 1 : Lcd Chr(2)   Case 5 : Lcd Chr(1)   Case 10 : Lcd Chr(1)   Case 15 : Lcd Chr(1)   Case 20 : Lcd Chr(1)   Case Else : Lcd Chr(32)   End Select   Next I   Waitms 1000  LoopEnd
Link spre comentariu
  • 3 săptămâni mai târziu...

Cum folosesc Watch-Dog Timerul?Am o aplicatie pe ATMega48, si se intampla ca dupa 3-4 ore sa nu mai functioneze.Ma gandesc sa-i setez WatchDog-ul, dar nu stiu cum se foloseste. E deajuns sa setez fusebitul WDTON?Ca idee, vreau ca WD-ul sa fie activ si sa supravegheze uC ca sa fie in functionare continua, in caz contrar sa il reseteze.Multumesc.

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