Jump to content
ELFORUM - Forumul electronistilor

Computer pentru bicicleta


Recommended Posts

Am si eu o problema. Sunt cam la baza uC. Ce vreau eu este sa fac un computer pentru bicicleta.Am zis sa o iau usor. Am inceput cu bascom-avr si isis.. Am inceput cu un led si un buton. Pe urma am avansat la lcd.Am reusit sa afisez pe el, dar cand vreau sa bag semnal cu ajutorul unui buton pe un pin nu mi-l citeste. uC este atmega8. Atasez codul in bascom si fisierul din isis.Poate reusiti sa imi spuneti unde gresesc ca imi mananca zilele de dimineata :jytuiyu

Link to comment
Share on other sites

Pai ... tu spuneai :

.....dar cand vreau sa bag semnal cu ajutorul unui buton pe un pin nu mi-l citeste

prin urmare daca vrei sa "bagi " semnal pe un PIN, de ce in cod testezi PORT si nu PIN"If PIND.2=....."(citeste datasheet)
Link to comment
Share on other sites

M-am uitat prin codul tau si am gasit asa:

 

1. identeaza codul ca sa pricepi usor ce vrei sa faci, e foarte important desi functioneaza si neidentat, cam asa de ex:

 

$regfile = "m8def.dat"$crystal = 1000000$baud = 19200                                               ' default use 40 for the frame spaceDim A As ByteConfig Portd.2 = Input                                      'CONFIG PORTD.2 AS INPUTConfig Lcd = 16 * 2                                         'configure lcd screenConfig Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , _                       Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6ClsLcd "BICLA"Wait 1ClsIf Portb.2 = 1 Then  Do    Lcd "buton activat"    Wait 1    Cls  LoopEnd IfIf Portb.2 = 0 Then  Do    Lcd "butonul neapasat"    Wait 1    Cls  LoopEnd IfEnd

2. ai bucle infinite DO ... LOOP. Lipseste conditia de iesire din bucla si nici alte metode de iesire nu ai (gen intreruperi sau alceva)

 

3. ca sa citesti contacte iti trebuie neaparat debouncing

 

4. Nu stiu ce schema folosesti dar la orice citire de contacte trebuie sa tragi pinul cu contactul de citit la V+ cu o rezistenta externa sau cu cea interna a portului (activezi pull-up rezistor pe pinul de citit)

 

5. Citirea o faci cu instructiunea PIN, nu PORT

 

Spor la treaba!

Link to comment
Share on other sites

$regfile = "m8def.dat"$crystal = 1000000$baud = 19200 ' default use 40 for the frame spaceDim A As ByteConfig Portd.2 = Input 'CONFIG PORTD.2 AS INPUTConfig Lcd = 16 * 2 'configure lcd screenConfig Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , _ Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6ClsLcd "BICLA"Wait 1ClsDoIf Portb.2 = 1 Then Lcd "buton activat" Wait 1 ClsEnd IfIf Portb.2 = 0 Then Lcd "butonul neapasat" Wait 1 ClsEnd IfLoopEnd

Link to comment
Share on other sites

Danzup l-am scris in bascom exact cum ai spus tu...dar isisul meu tot nu vrea sa simuleze bine. imi zice decat buton neapasat chiar si cand apas.Am scos subrutina If Pinb.2 = 0 ThenLcd "butonul neapasat"Wait 1ClsEnd Ifsi acum dupa mesajul"bicla" nu mai imi afiseaza nimica chiar si daca apas.

Link to comment
Share on other sites

Danzup l-am scris in bascom exact cum ai spus tu...dar isisul meu tot nu vrea sa simuleze bine. imi zice decat buton neapasat chiar si cand apas.Am scos subrutina If Pinb.2 = 0 ThenLcd "butonul neapasat"Wait 1ClsEnd Ifsi acum dupa mesajul"bicla" nu mai imi afiseaza nimica chiar si daca apas.

si normal : ai activat rezistenta pullup pentru pinb.2 ?isis e un pic cretin !daca il scrii in microcontroler o sa mearga cum am scris eu !
Link to comment
Share on other sites

Chef esti boss atunci daca zici ca merge. Rezistentele pull-up interne nu leam activat :jytuiyu . Oricum in locul acelui buton o sa vina un senzor TLE4935 montat pe roata cu 2 magneti. Atunci o sa masor "timpul" cu un counter si o sa afisez viteza .Oricum thx danzup. Esti tare...tineo tot asa :da .

Link to comment
Share on other sites

Se pare ca am gresit la functia if, adica nu citeam pinul care trebuia. Acum merge bine:d. Multumesc tuturor pentru ajutorul dat.

$regfile = "m8def.dat"$crystal = 1000000$baud = 19200                                               ' default use 40 for the frame spaceDim A As ByteConfig Portd.2 = Input                                      'CONFIG PORTD.2 AS INPUTConfig Lcd = 16 * 2                                         'configure lcd screenConfig Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , _                       Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6ClsLcd "BICLA"Wait 1ClsdoIf Pind.2 = 1 Then      Lcd "buton activat"    Wait 1    Cls  End IfIf Pind.2 = 0 Then      Lcd "butonul neapasat"    Wait 1    Cls  End IfloopEnd

Acum am dat de alta belea :( .Configurez timer1 ca si counter, ii dau sa inceapa sa numere cu ajutorul "start timer1", asta bineinteles dupa ce opresc timer1. Bun, dar dupa aia cum citesc numarul contorizat de timer?

Link to comment
Share on other sites

Salutare,

 

Doar ca idee puteti sa va inspirati. Codul este scris de un german si este functionabil.

O alta idee ar fi sa construiti un mic meniu unde sa afisati si viteza in Km/h, ceasul, distanta si timpul in care parcurgeti un anumit traseu.

 

Multa bafta!

 

$regfile = "m8def.dat"                                      'ATMEGA 8$crystal = 16000000                                         '16 MHz Quartz$hwstack = 128$framesize = 128$swstack = 128 Dim Zaehler As WordDim Result As WordDim A As WordDim I As WordDim Timer_flag As ByteDim Ergebnis As Word'* BalkenanzeigeDeflcdchar 0 , 31 , 31 , 31 , 31 , 31 , 31 , 31 , 31'* TimerkonfigurationConfig Timer0 = Counter , Edge = FallingConfig Timer1 = Timer , Prescale = 256Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5Config Lcd = 20 * 2                                         'LCD-Modul 2x20Config Pind.4 = Input                                       'PD4 ist counterinput T0 / hier kommt der Ausgang vom TLE 4905L dranOn Timer0 Sprung_in_supOn Timer1 Timer_irqEnable Timer0Enable Timer1Enable InterruptsLoad Timer1 , 62750Cursor OffCls'* Displayanzeige für DrehzahlausgabeLocate 1 , 1Lcd "Drehzahl"Locate 1 , 15Lcd "RPM"'* HauptprogrammDo   If Timer_flag = 1 Then      Timer_flag = 0     Locate 1 , 9     Lcd "     "                                            'Drehzahlwert in Anzeige löschen     Ergebnis = Result * 60                                 'Umdrehungen pro Minute     Locate 1 , 10     Lcd Ergebnis     '* Balkenanzeige     A = Result / 250     A = Ergebnis / 250     Locate 2 , 1      For I = 1 To 20      If A >= I Then         Lcd Chr(0)      Else         Lcd " "      End If      Next   End IfLoopEnd'* Unterprogramm für Timer 0Sprung_in_sup:Incr ZaehlerReturn'* Unterprogramm für Timer 1Timer_irq:   Load Timer1 , 62750   Zaehler = Zaehler * &HFF   Zaehler = Timer0 + Zaehler   Result = Zaehler   Timer0 = 0   Zaehler = 0   Timer_flag = 1Return
Link to comment
Share on other sites

Programul dupa modificarile aferente. Acum mam gadit: daca tot am loc si spatiude ce sa nu imi pun cateva functii cat de cat ultile cum ar fi semnalizare si lumini. Leam implementat in program si imi afiseaza pe lcd, dar nu ii dau de cap sa imi activeze pinul de comanda al tranzistorul care aprinde ledurile.

$regfile = "m8def.dat"                                      'ATMEGA 8$crystal = 8000000                                          '16 MHz Quartz$hwstack = 128$framesize = 128$swstack = 128Dim Numarator As WordDim Result As WordDim A As WordDim I As WordDim Timer_flag As ByteDim Rezultat As WordDim Pozitie As Byte'*Semnal dreaptaDeflcdchar 0 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32        ' replace ? with number (0-7)Deflcdchar 1 , 24 , 28 , 30 , 31 , 31 , 30 , 28 , 24        ' replace ? with number (0-7)'*Semnal stangaDeflcdchar 2 , 3 , 7 , 15 , 31 , 31 , 15 , 7 , 3            ' replace ? with number (0-7)Deflcdchar 3 , 32 , 32 , 31 , 31 , 31 , 31 , 32 , 32'*Lumini aprinseDeflcdchar 4 , 3 , 5 , 9 , 17 , 17 , 9 , 5 , 3              ' replace ? with number (0-7)Deflcdchar 5 , 31 , 32 , 31 , 32 , 32 , 31 , 32 , 31        ' replace ? with number (0-7)'* Configurare TimerConfig Timer0 = Counter , Edge = FallingConfig Timer1 = Timer , Prescale = 1024Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5Config Lcd = 16 * 2                                         'LCD-Modul 2x16Config Pind.1 = OutputConfig Pind.2 = OutputConfig Pind.3 = OutputConfig Pind.4 = InputConfig Pind.5 = InputConfig Pind.6 = InputConfig Pind.7 = InputConfig Portc = Output                                       'PD4 ist counterinput T0 / hier kommt der Ausgang vom TLE 4905L dranOn Timer0 Sprung_in_supOn Timer1 Timer_irqEnable Timer0Enable Timer1Enable InterruptsLoad Timer1 , 62750Cursor OffCls'* Programul principalDoLocate 1 , 1Lcd "Viteza"Locate 1 , 14Lcd "kmh"If Timer_flag = 1 Then   Timer_flag = 0   Locate 1 , 8   Lcd "      "                                             'rotatii pe sec   Rezultat = Result * 0.9                                  'Rotatii pe Minut   Locate 1 , 9   Lcd Rezultat   End IfIf Pind.6 = 1 Then   Locate 2 , 1   Lcd "  "   Reset Pind.2   Waitms 300   Locate 2 , 1   Lcd Chr(2)   Lcd Chr(3)   Set Pind.2   Waitms 300   Locate 2 , 1   Lcd "  "End IfIf Pind.7 = 1 Then   Locate 2 , 1   Lcd "  "   Waitms 300   Locate 2 , 5   Lcd Chr(0)   Lcd Chr(1)   Waitms 300   Locate 2 , 5   Lcd "  "End IfIf Pind.5 = 1 Then   Waitms 500   If Pozitie = 0 Then   Pozitie = Pozitie + 1   Set Pind.3   Locate 2 , 3   Lcd Chr(4)   Lcd Chr(5)   Waitms 100Else   Pozitie = 0   Reset Pind.3   Locate 2 , 3   Lcd " "   Locate 2 , 4   Lcd " "   Waitms 100   End IfEnd IfLoopEnd'* Subrutina Timer 0Sprung_in_sup:Incr NumaratorReturn'* Subrutina Timer 1Timer_irq:   Load Timer1 , 62750   Numarator = Numarator * &HFF   Numarator = Timer0 + Numarator   Result = Numarator   Timer0 = 0   Numarator = 0   Timer_flag = 1Return
Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines