Sida 1 av 3
Förstärka signal på 3.5 v till 5v
Postat: 10 september 2005, 12:50:18
av Virr3
hejsan
jag undrar hur man enklast förstärker en signal på ca 3.5 v till 5?
transistor är ju ett altenativ, men finns det fler...
håller på med min stackars ledsnurra och ska försöka lära mig lite och inte bara koppla blint efter vad andra säjer...
jag tycker att det gått ganska okej hitils, men det är det att jag har en signal från en läsgaffel, och den vill inte komma över 3.5 volt så porten reagerar aldrig i atmegan...
aja, skulle vara tacksam för hjälp
Postat: 10 september 2005, 13:05:24
av strombom
det borde atmegan känna av, säker på att det inte är något annat fel ?
Kollade i databladet och där står det att gränsen är 0.6 * Vcc
Om du matar atmegan med 5V så är gränsen vid 3V
/Johan
Postat: 10 september 2005, 13:07:21
av bengt-re
3,5V lär väl tolkas som hög signal? Antar att det är C-MOS krets och då är allt över halva matningsspänningen hög signal. KOlla att du inte har något strul i programmet, för alla normal uP brukar tolka 3,5V som en klockren 1á.
Postat: 10 september 2005, 13:22:19
av Virr3
DDRC= sen skiver man vilka bitar som ska va utgångar eller hur?
hur skriver jag om jag vill ha ingångar istället?
har nämligen inte satt den som ingång...
Postat: 10 september 2005, 13:40:05
av strombom
Utgång:
DDRC |= (1<<PIN_NUMMER);
Ingång:
DDRC &= ~(1<<PIN_NUMMER);
Flera på en gång:
Utgångar:
DDRC |= (1<<PIN_NUMMER) | (1<<PIN_NUMMER2);
Ingångar:
DDRC &= ~(1<<PIN_NUMMER) & ~(1<<PIN_NUMMER2);
Postat: 10 september 2005, 14:51:54
av Virr3
Kod: Markera allt
int main()
{
DDRC = _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3)| _BV(PC4)| _BV(PC5)| _BV(PC6)| _BV(PC7)| _BV(PA5);
DDRC &= ~ _BV(PA2);
if (PINA & _BV(PA2))
{
PORTB |= _BV(PC0);
PORTB |= _BV(PC1);
PORTB |= _BV(PC2);
PORTB |= _BV(PC3);
PORTB |= _BV(PC4);
PORTB |= _BV(PC5);
PORTB |= _BV(PC6);
PORTB |= _BV(PC7);
}
}
Vad är de för fel?

Postat: 10 september 2005, 15:00:57
av strombom
varför har du PA5 och PA2 i DDRC ?
använd DDRA
/Johan
Postat: 10 september 2005, 16:41:23
av Virr3
Kod: Markera allt
int main()
{
DDRC = _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3)| _BV(PC4)| _BV(PC5)| _BV(PC6);
DDRA = _BV(PC7) | _BV(PA5);
DDRA &= ~ _BV(PA2);
if (PINA & _BV(PA2))
{
PORTB |= _BV(PC0);
PORTB |= _BV(PC1);
PORTB |= _BV(PC2);
PORTB |= _BV(PC3);
PORTB |= _BV(PC4);
PORTB |= _BV(PC5);
PORTB |= _BV(PC6);
PORTB |= _BV(PC7);
}
}
funkar inte häller

Postat: 10 september 2005, 16:57:14
av strombom
varför har du PC7 i DDRA
hur kommer det sig att du kollar if (PINA & _BV(PA2)) direkt i mainkoden
är det inte bättre om du gör en liten loop så du kan kontrollera funktionen i lugn och ro
Postat: 10 september 2005, 17:05:19
av Virr3
Kod: Markera allt
int main()
{
int i;
DDRC = _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3)| _BV(PC4)| _BV(PC5)| _BV(PC6)| _BV(PC7);
DDRA = _BV(PA5);
DDRA &= ~ _BV(PA2);
for(i;i<200;i++)
{
if (PINA & _BV(PA2))
{
PORTB |= _BV(PC0);
PORTB |= _BV(PC1);
PORTB |= _BV(PC2);
PORTB |= _BV(PC3);
PORTB |= _BV(PC4);
PORTB |= _BV(PC5);
PORTB |= _BV(PC6);
PORTB |= _BV(PC7);
_delay_loop_2(10000);
}
}
}
så menar du eller?
varför jag la de direkt i main bara?
jo, det va så att jag va bara sugen på att se ifall det funkade, och det va de enklaste sättet, lös lysdioderna efter de att jag programerat den så funkade och om de inte gjorde de så funkade de inte, vilket det tyvärr inte gör...
kan tillägga att när jag ändrat lite nu och mätt upp, så är emitterspänningen på 5.5 v istället för 3.5...[/code]
Postat: 11 september 2005, 12:30:28
av cykze
Nu har du ju en massa PC i dina PORTB-rader igen. Du ska aldrig blanda C och B, även om det fungerar ibland. Dessutom råder jag dig starkt att försöka lära dig bitoperationer ordentligt. Det kanske kan vara lite krångligt i början, men du kommer ha stor nytta av att kunna det.
Din kod ska med största sannolikhet se ut så här:
Kod: Markera allt
int main()
{
DDRC = 0xFF; // Att sätta samtliga åtta bitar är det samma som 0xFF
DDRA = _BV(PA5);
//DDRA &= ~ _BV(PA2); // Du behöver inte nollställa biten PA2 eftersom den inte är satt. Se raden ovan.
while (1) // Loopar för evigt
{
if (PINA & _BV(PA2))
{
PORTC = 0xFF;
}
}
return 0;
}
>
kan tillägga att när jag ändrat lite nu och mätt upp, så är emitterspänningen på 5.5 v istället för 3.5...
Vad för emitterspänning? Vilken spänning matar du AVR:en med? 5.5V låter lite farligt.
Postat: 11 september 2005, 12:54:47
av Virr3
jag matar avr:en med 5v...
läsgaffeln har jag kopplat till batteriet, innan spännings regulatorn... annars får den inte tillräckligt..
jag kanske ska sätta ett motstånd efter fototransistorn?
nu är hela port c hög...
bara de att de är höga hela tiden, eller jag behöver inte sätta pa2 hög ens...
Btw: vart kan jag läsa om bitoperationer? jag har letat endel men inte hittat något som är riktigt bra, antar att de står lite i databladet för avr:en men, det gör mig bara förvirrad

Postat: 11 september 2005, 13:16:10
av cykze
Då är 5.5V max vad AVR:ens i/o-pinnar tål! Inte bra.
*kollar din andra tråd om läsgaffeln*
Du ska enbart koppla E (emittern) till jord och C (kollektorn) till en i/o-pinne. Sedan aktiverar du det interna pullup:et i AVR:en för i/o-pinnen du kopplar den till. Det gör du genom att sätta pinnen till ingång (görs i t ex DDRA) och sedan sätta motsvarande bit i t ex PORTA för att aktivera pullup:et.
Postat: 11 september 2005, 13:39:35
av Virr3
uräkta cykze

men, skulle du inte kunna förklara det där igen?
är lite av en nybörjare, så, väldigt utförligt
skulle bli väldigt glad ifall du kunde göra de

Postat: 11 september 2005, 13:53:48
av cykze
Berätta gärna vad du inte förstår i beskrivningen.