Sida 5 av 6
Postat: 9 november 2004, 16:50:27
av Virr3
rickeboy skrev:R7 och R8:a är onödiga, Reset räcker det med ett 10k motstånd till Vcc...
//Rille
så jag satte ett 10k där.. men kanske har något runt 47.. behöver jag värkligen inte kondingen mällan vcc och gnd som det står i databladet?
Postat: 9 november 2004, 17:29:05
av matseng
Han menar R7 kan tas bort. R8 ersättas med ett en kabelstump. De 10K som han nämde ska mellan AVR'ens RESET och plus.
Du har ersatt ett 47 ohms motstånd (R8) och en konding med ett 10K motstånd - det är inte mycket att fundera på att det inte fungerar då.
Jag har sagt det förut, och jag komer säkert att säga det igen. Innan man vet vad man håller på med så är det bäst att bygga EXAKT efter någons färdiga och uttestade schema och få det att fungera INNAN man börjar göra egna modifieringar och ändringar på det.
Postat: 9 november 2004, 20:03:15
av Virr3
nu funkar den..jag får 4,47 eller något från ut pinnen på motagaren men lysdioden som ska indikera det lyser mycket svagt.. den får bara 2,33 ut från PB7.. den lyser så svagt at jag endast ser det ovanifrån..
om jag knappar på fjärrkontrollen så blinkar leden..
om jag tar bort irdioden fortsätter den att lysa..
och om jag bara stoppar ner anoden på irdioden så lyser den blåa leden lite lite mer..
Postat: 9 november 2004, 21:41:43
av Hedis
Utsignalen ifrån ir-mottagaren är HÖG om den INTE får ngn 38khz modulerad data in.
Så att den lyser när du inte skickar data är inte så konstigt.
Om jag vore du så skulle jag först konstruera endeså mottagaren eller transmittern. INTE bägge samtidigt. Annars så vet du ju inte vilken utav dom som inte fungerar som den skall.
Jag har själv byggt en ir-transmitter och kan ju påpeka att pulstiderna måste vara mycket exacta, annars blir det pannkaka utav alltihop. Efterssom man bygger alltihop på fasta timer rutiner (iaf. jag) så om varje loop var ngn µS för lång så blir det många µS tillslut.
Så man behöver frekvensräknare eller oscilloskop. (och kunskapen att beräkna pulstid ifrån frekvens mm) F=1/T (T=Tid, F=Frekvens)
Postat: 9 november 2004, 21:55:47
av Virr3
jag har varken en frekväns räknare eller ett oscilloskop
jag byggde upp sändaren först och testade den med en blå lysdiod om den funkade och lysdioden lös och frekvänsen kaunde jag som sagt inte kolla men jag antog att det var rätt.. sen så satte jag mig och pillade på motagaren.. alltså har jag inte gjort båda sammtidigt utan med en dags mällanrum..
sak samma..
hur kan jag kolla om min sändare har rätt frekväns?
ska se om jag kan köpa en lite bättre multimeter.
någon att rekomendera?
Postat: 9 november 2004, 22:00:13
av Hedis
Datorns ljudkort duger fint till o mäta ir-datan. (dock inte 38Khz bärvågen)
Anslut ljudkortets ena kanal till Out på ir-mottagaren och jorden till bygget och kör tex. goldwave o spela in en snutt. Du kan ju även spela in en snutt ifrån din tv-fjärr så ser du hur det bör se ut
En sak som man får tänka på är att ljudkortet har kondingar på ingångarna så det är enbart växelspänning som kommer igenom. Så flankerna syns tydligt men även om signalen ligger stabilt på 5v så kommer den att sjunka i ljudprogrammet. Men för mig så fungerade det fint.
Postat: 9 november 2004, 22:13:54
av rickeboy
Virr3>> Vilken kod använder du? Om du använder den på sidan innan så konstaterade jag nu att du endast kör den 1 gång! Sätt if satserna i en while sats typ:
Sen bör du se över så att du har tänkt och kodat rätt... dvs hur pinarna ska vara dvs om de ska vara höga/låga, input/output...
//Rille
Postat: 18 november 2004, 19:32:02
av Virr3
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
int main()
{
while (1)
{
if (PORTB = _BV(PD4)) // om PD0 är hög
PORTD |= _BV(PD5); //sätt PD1 hög
else
PORTD &= ~_BV(PB5); //sätt PD1 låg
return 1;
}
}
så ser den koden jag använder ut.. är den fel?
och varför lyser min lysdiod såpass lite? den får 2,34v av avr:en.. varför inte 5v?
den blinkar till när jag riktar fjärren mot den och byter kanal.. ingenting händer ifall jag tar bort ir dioden..
Postat: 18 november 2004, 20:50:57
av Xyzzy
Ska du läsa en pinne eller ports register (värde) ska du använda PINx (ex. "PINB" om det är portB)
Postat: 18 november 2004, 21:46:29
av Virr3
j*klar

får prova om de funkar i morgon..
Postat: 18 november 2004, 21:48:03
av cykze
Virr3 skrev:Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
int main()
{
while (1)
{
if (PORTB = _BV(PD4)) // om PD0 är hög
PORTD |= _BV(PD5); //sätt PD1 hög
else
PORTD &= ~_BV(PB5); //sätt PD1 låg
return 1;
}
}
så ser den koden jag använder ut.. är den fel?
och varför lyser min lysdiod såpass lite? den får 2,34v av avr:en.. varför inte 5v?
den blinkar till när jag riktar fjärren mot den och byter kanal.. ingenting händer ifall jag tar bort ir dioden..
if (PORTB = _BV(PD4))
betyder att PD4 i PORTB sätts hög OM det hade varit en utgång. Därefter kollar if-satsen om PORTB är skiljt från noll. Inte vad du vill.
Som det redan har sagts i tråden så måste du börja med att tala om vilka pinnar som ska vara utgångar (höga eller låga) och vilka som ska vara ingångar (hög-ohmiga eller med pull-up). Det gör du genom DDRB och PORTB för PortB-pinnarna och genom DDRD och PORTD för PortD-pinnarna osv. Det är det mest grundläggande för att man ska få någonting gjort med µC:n.
DDRB är 8 bitar stor. Varje bit anger vilken pinne som ska vara ingång respektive utgång. Är en bit satt till 1 i DDRB så blir motsvarande port konfigurerad till att vara utgång. PORTB fungerar på liknande sätt. Är en bit för en pinne satt till 1 i DDRB så blir motsvarande pinne satt hög om den biten är satt till 1 i PORTB. Är biten för en µC-pinne satt till 0 i DDRB så blir betyder motsvarande 1:a i PORTB att porten får ett inbyggt pull-up-motstånd. Är den istället 0 betyder det att ingången är högohmig. Det står mycket bättre förklarat i databladet. Läs igenom avsnitten för I/O-portar.
Istället för
if (PORTB = _BV(PD4))
ska du ha
if (PIND & _BV(PD4))
Du kan ju inte blanda ihop PD4 med PORTB. D och B är inte ens samma port! Dessutom stämmer dina kommentarer inte alls, som du ser! Sen har du lagt return-satsen i while-loopen vilket betyder att programmet kommer avslutas efter en loop.
Läs ett tidigare inlägg av mig för lite bättre förklaringar
När du fått kläm på det här med bit-hanteringen har du kommit en bra bit på vägen. Ta och läs någon bra C-bok. Det kommer du ha stor nytta av.
Så här ska ditt program se ut:
Kod: Markera allt
#include <avr/io.h>
#include <avr/delay.h>
#include <inttypes.h>
int main()
{
DDRD = _BV(PD5); // Sätter PD5 till utgång
while (1)
{
if (PIND & _BV(PD4)) // om PD4 är hög
PORTD |= _BV(PD5); //sätt PD5 hög
else
PORTD &= ~_BV(PD5); //sätt PD5 låg
}
return 1;
}
Postat: 18 november 2004, 21:53:02
av Virr3
jkag vet inte vad jag satt och gjorde.. aja.. ska kolla igenom bättre innnan ja postar här.. sorry..
Postat: 19 november 2004, 16:19:32
av Virr3
provade din klod.. ingen skillnad..
lysdioden lyser lite lite mer..
Postat: 19 november 2004, 21:58:42
av cykze
Koppla bort Ir-mottagaren.
Dra en kabel mellan PD4 och +5V (eller vad du har för matningsspänning). Kolla spänningen på PD5. Den ska då vara på +5V (om du matar AVR:en med det).
Gör om samma sak men koppla PD4 till jord istället. Kolla spänningen på PD5. Den ska nu vara 0V.
Stämmer det så är det något annat som är fel.
Postat: 19 november 2004, 22:54:40
av Hedis
Vilket värde är det på motståndet som sitter i serie med dioden?