Sari la conținut
ELFORUM - Forumul electronistilor

Probleme de incepatori


Postări Recomandate

Vizitator nenea dani

Buna ziua tuturor Am si eu o intrebare de subincepator pentru Attiny461 . Dupa ce am lucrat doi oameni vreo 4 zile ca sa scriem un program in C pentru un led clipitor acum avem urmatoarea problema de rezolvat . Cum declar ca intr-un port unii pini sa fie iesiri iar altii intrari cu rezistente de pull-up ? . Vreau sa aprind un led la un pin din portul A cand pun la masa un pin din portul B. Nu reusesc nici cum . Aceasta este o varianta care bineanteles ca nu functioneaza . #include // header #define F_CPU 8000000UL // stabilesc frecventa 8Mhz#include // header pentru intarzieriint main(void) // The main function { // incep programulDDRA=0XB1; // portul A este iesire DDRB=0X00; // portul B este intrarePORTB=0XFF; // pull-up la toti pinii BPORTA=0X00; // Led-ul din pinul 20 este stins if(PORTB == 0x80) // Daca butonul din pinul 10 este apasatPORTA = 0x01 ; // Atunci Led-ul din pinul 20 lumineaza }

Link spre comentariu

In primul rand CITESTE DATASHEETUL!!!!!!!!!

Acolo se explica foarte clar si cu exemple atat in ASM cat si in C cum se seteaza si cum se citesc porturile. Daca citeai probabil ca nu mai stateai 4 zile sa aprinzi un led.

Acum incearca

if(PINB&(1<<7)) //testezi starea PINului care te intereseaza (stare care o afli citind registrul PIN nu PORT); starea portului putand fi diferita de 0x80PORTA |=0x01; //setezi bitul 1 din portul A; facand PORTA=0x01; schimbi starea tuturor pinilor de pe PORTA lucru destul de nasol daca ai alte chestii legate pe PORTA si nu trebuiesc schimbate.

Once again: cititi oameni buni datasheet-urile ca nu degeaba sunt facute!!!!

Link spre comentariu
  • 4 săptămâni mai târziu...

sincer primele datasheet-uri care le-am citit m-au cam lasat in ceata... dupa ce m-am jucat 4-5 ore cu primele microcontrollere am inceput sa inteleg si ce scrie prin datasheet-uri. doresc doar sa subliniez faptul ca nu e suficient sa te duca capul si sa vrei ceva... trebuie sa te si familiarizezi. iar pentru mine forumul a fost un mediu agreabil de familiarizare atat cu electronica in general cat si cu microcontrollerele.

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

Am si eu o problema cu un programel de termometru pe 1wire cu DS18B20.

Este vorba de cel de mai jos :

 

$regfile "m32def.dat"$crystal = 16000000Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7 , E = Portc.3 , Rs = Portc.2Declare Sub Convallt                                        ' Convert T on ALL sensorsDeclare Sub Meas_to_cel(offset As Byte)Declare Sub Temp_to_decicelDeclare Sub Disp_temp(cnt As Byte , Offset As Byte)' Up to 8 devices - each having an 8 byte ROMIDConst Max1wire = 8Dim Dsid(64) As Byte                                        ' Dallas ID 64bit inc. CRCDim Sc(9) As Byte                                           ' scratch padDim Cnt1wire As Byte                                        ' Number of 1-wire devices foundDim Cel As IntegerDim Cel_frac_bit As ByteDim Subzero As ByteDim Temp As Integer'Temp variablesDim B As ByteDim B1 As ByteDim B2 As ByteDim I As ByteDim W As WordConst Ds18b20_conf_reg = 4' constant to convert the fraction bits to cel*(10^-4)Const Ds18x20_fracconv = 625' DS18x20 ROM IDConst Ds18s20_id = &H10Const Ds18b20_id = &H28' COMMANDSConst Ds18x20_convert_t = &H44Const Ds18x20_read = &HBEConst Ds18x20_write = &H4EConst Ds18x20_ee_write = &H48Const Ds18x20_ee_recall = &HB8Const Ds18x20_read_power_supply = &HB4'LCD config'Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0'Config Lcd = 16 * 1aConfig 1wire = Portd.4                                      ' DS1820 on Port B.4 (mega8 pin 18)Cursor OffClsLcd "1-wire DS18x20"Wait 1Cls' Gather ROM ID for all 1-wire devicesCnt1wire = 1wirecount()If Cnt1wire > Max1wire Then  Cnt1wire = Max1wireEnd IfB = 1Dsid(b) = 1wsearchfirst()For I = 1 To Cnt1wire  B = B + 8  Dsid(b) = 1wsearchnext()Next' Show what we found on the busB1 = 1B2 = 8For I = 1 To Cnt1wire  Cls  If Dsid(b2) = Crc8(dsid(b1) , 7) Then    Lcd "CRC OK sensor " ; I    Waitms 500    Cls    Lcd "ROM ID "    For B = B1 To B2      Lcd Hex(dsid(b))    Next  Else    Lcd "CRC BAD sensor " ; I  End If  Wait 1  B1 = B1 + 8  B2 = B2 + 8Next' Monitor temperature sensorsDo  Convallt  Waitms 750  B = 1  For I = 1 To Cnt1wire    If Dsid(b) = Ds18s20_id Or Dsid(b) = Ds18b20_id Then    ' Only process TEMP sensors      1wverify Dsid(b)                                      'Issues the "Match ROM "      If Err = 1 Then        Cls        Lcd "18x20 not on bus"                              'where did it go?      Elseif Err = 0 Then        1wwrite Ds18x20_read        Sc(1) = 1wread(9)        If Sc(9) = Crc8(sc(1) , 8) Then          Call Disp_temp(i , B)          If I < Cnt1wire Then                              ' if more 1-wire devices.             Wait 1                                                   ' SE SETEAZA TIMPUL DE AFISARE PT TEMP 1          End If        End If      End If    End If    B = B + 8  NextLoopEnd'Makes the Dallas "Convert T" command on the 1w-bus configured in "Config 1wire = Portb. "'WAIT 200-750 ms after issued, internal conversion time for the sensor'SKIPS ROM - so it makes the conversion on ALL sensors on the bus simultaniously'When leaving this sub, NO sensor is selected, but ALL sensors has the actual'temperature in their scratchpad ( within 750 ms )Sub Convallt 1wreset                                                    ' reset the bus 1wwrite &HCC                                               ' skip rom 1wwrite Ds18x20_convert_tEnd Sub'   output is:'   - cel full celsius'   - fractions of celsius in millicelsius*(10^-1)/625 (the 4 LS-Bits)'   - subzero =0 positiv / 1 negativSub Meas_to_cel(offset As Byte) Dim Meas As Word Meas = 0 Meas = Makeint(sc(1) , Sc(2)) ' 18S20 is only 9bit upscale to 12bit If Dsid(offset) = Ds18s20_id Then   Meas = Meas And &HFFFE   Shift Meas , Left , 3   B1 = 16 - Sc(6)   B1 = B1 - 4   Meas = Meas + B1 End If If meas.15 = 1 Then   Subzero = 1   ' convert to +ve, (two's complement)++   Meas = Meas Xor &HFFFF   Incr Meas Else   Subzero = 0 End If If Dsid(offset) = Ds18b20_id Then   B1 = Sc(ds18b20_conf_reg)   ' clear undefined bit for != 12bit   If B1.5 = 1 And B1.6 = 1 Then                            ' 12 bit    ' nothing   Elseif B1.6 = 1 Then                                     ' 11 bit     Meas = Meas And &HFFFE   Elseif B1.5 = 1 Then                                     '10 bit     Meas = Meas And &HFFFC   Else                                                     ' 9 bit     Meas = Meas And &HFFF8   End If End If Cel = Meas Shift Cel , Right , 4 Cel_frac_bit = Meas And &HFEnd Sub' input: cel, cel_frac_bit, subzero' output: temp (as decicelsius)' ie 289 = 28.9CSub Temp_to_decicel  Temp = Cel_frac_bit * Ds18x20_fracconv  Temp = Temp / 1000  Cel = Cel * 10  Temp = Temp + Cel  If Subzero = 1 Then     Restore Rounding     For B1 = 1 To 8        Read B2        If Cel_frac_bit = B2 Then          Incr Temp          Exit For        End If     Next  End IfEnd Sub' Display the temperature' INPUT: tempSub Disp_temp(cnt As Byte , Offset As Byte)  Call Meas_to_cel(offset)  Call Temp_to_decicel  Cls  Lcd "TEMP " ; Cnt ; " "  If Subzero = 1 Then    Lcd "-"  Else    Lcd "+"  End If  W = Temp / 10  B1 = Temp Mod 10  Lcd W ; "." ; B1  Lcd " C"End SubRounding:Data 1 , 3 , 4 , 6 , 9 , 11 , 12 , 14
Practic "printarea" finala pe LCD se face cu

 

Lcd "TEMP " ; Cnt ; " "
+ C de la Celsius.

 

Ma intereseaza ca in loc de Cnt sa imi apare IN sau OUT.

 

Am incercat ceva cu If dar nu am reusit...de ex :

 

If Cnt=1

Cnt ="IN"

End if

 

Cnt este de tip Byte.

 

Imi prind urechile rau....

 

 

..Si ar mai fi o chestie...

Daca am mai multi senzori, programul mi-i arata alternant, cu un delay de 1 secunda :

 

If Dsid(b) = Ds18s20_id Or Dsid(b) = Ds18b20_id Then    ' Only process TEMP sensors      1wverify Dsid(b)                                      'Issues the "Match ROM "      If Err = 1 Then        Cls        Lcd "18x20 not on bus"                              'where did it go?      Elseif Err = 0 Then        1wwrite Ds18x20_read        Sc(1) = 1wread(9)        If Sc(9) = Crc8(sc(1) , 8) Then          Call Disp_temp(i , B)          If I < Cnt1wire Then                              ' if more 1-wire devices.             [b]Wait 1[/b]                                                   ' SE SETEAZA TIMPUL DE AFISARE PT TEMP 1          End If        End If      End If    End If
Daca eu modific acel Wait 1 scris mai sus cu bold, atunci imi ramane afisat pentru X secunde doar TEMP 1, iar TEMP 2 este tot de 1 secunda.

 

Cum le pot modifica ?

 

 

Multumesc !

 

 

 

PS : Codul original este de aici http://www.dbzoo.com/atmel/ds18b20

Link spre comentariu

Inca o chestie....Conform aplicatiei An#111 de la BASCOM, temperatura este afisata cu 3 cifre, gen 123 ca fiind 12.3 grade.Ce trebuie sa fac ca temperatura sa-mi apara 12.3, deci cu virgula ?Am incercat sa impart numarul obtinut la 10, declarand o variabila pe care sa mi-o printeze, ca integer....deci numar intreg, deci nu are virula.Daca ii dau variabila SINGLE, imi pune Ţşpe zecimale dupa virgula.

Link spre comentariu

Salut,

 

'-----------------------------------------------------------------------------------------'copyright                : (c) 2008-2009, AVRprojects.info'purpose                  : DS1820 / DS18S20 Temperature Indicator'-----------------------------------------------------------------------------------------'$sim$regfile = "m8515.dat"                                      ' specify the used micro$crystal = 8000000                                          ' used crystal frequencyDeclare Sub Read1820Config 1wire = Portd.7Config Lcd = 16 * 2Config Lcdpin = Pin , Db4 = Porta.2 , Db5 = Porta.3 , Db6 = Porta.4 , Db7 = Porta.5 , E = Porta.1 , Rs = Porta.0'Temp variablesDim Bd1 As ByteDim Bd2 As ByteDim Bd7 As ByteDim Bd8 As ByteDim I As Byte , Tmp As ByteDim T As Integer , T1 As IntegerDim Bd(9) As Byte                                           'Scratchpad 0-8 72 bits incl CRC, explanations for DS1820'Sc(1)  'Temperature LSB'Sc(2) 'Temperature MSB'Sc(3) 'TH/user byte 1 also SRAM'Sc(4) 'TL/user byte 2 also SRAM'Sc(5) 'config  also SRAM x R1 R0 1 1 1 1 1 - the r1 r0 are config for resolution - write FF to byte for 12 bit - others dont care'Sc(6) 'res'Sc(7) 'res'Sc(8) 'res'Sc(9) '8 CRC'DALLAS DS1820 ROM and scratchpad commands''''''''''''''''''''''''''1wwrite....'&H 33 read rom - single sensor'&H CC skip rom'&H BE read scratchpad'&H 44 convert T' Main loopClsCursor OffDo   1wwrite &HCC : 1wwrite &H44                              ' start measure   Waitms 400                                               ' wait for end of conversion   Read1820   Wait 1LoopEnd                                                         'end program'Read the DS1820 by skipping the ROM checking, since we are using only 1 sensorSub Read1820                                                ' reads sensor ans calculate                                               ' T for 0.1 C   1wreset                                                  ' reset the bus   1wwrite &HCC                                             ' read internal RAM   1wwrite &HBE                                             ' read 9 data bytest   Bd(1) = 1wread(9)   Bd1 = Bd(1)   Bd2 = Bd(2)   Bd7 = Bd(7)   Bd8 = Bd(8)                                               ' read bytes in array   1wreset                                                  ' reset the bus      Tmp = Bd1 And 1      If Tmp = 1 Then Decr Bd1                              ' 0.1C precision          T = Bd1          T = T * 50          T = T - 25          T1 = Bd8 - Bd7          T1 = T1 * 100          T1 = T1 / Bd8          T = T + T1          T1 = T / 100                                      'store tens          T = T Mod 100                                     'store decimal number          Cls          Locate 1 , 3          Lcd "Temperature"          Locate 2 , 7          Lcd T1 ; "," ; TEnd SubEnd
Link spre comentariu

Incerc cu un ATtiny13 sa citesc o tensiune oarecare, atunci cind e depasita (tensiunea) sa faca ceva bla bla bla....e capabil acesta de asa ceva?pentru ca in Bascom nu pot, asta am incercat :jytuiyu $regfile = "ATtiny13.DAT"$crystal = 1000000Config Portb.0 = OutputPortb.0 = 0Config Portb.5 = InputPortb.5 = 0Dim V As BitConfig Adc = Single , Prescaler = Auto , Reference = AvccStart AdcDoV = Getadc(0)V = V + 1Wait 1LoopEndSI asta e eroarea:[attachment=0]bas.jpg[/attachment]

Link spre comentariu

Ca sa faci conversia in celsius scazi 32 si imparti la 1.8. Vezi daca se potriveste temperatura afisata cu ce ar trebui sa masoare.

Asa am facut. Initial am scazut si eu 32, dar imi iesea peste 40. Acum imi arata 23.62 gr. Celsius...dar de unde ai luat 1.8 pentru ca nu-mi dau seama acum ?
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