Störningar i I/O-port i ATMega16
Störningar i I/O-port i ATMega16
Störningar i I/O-port i ATMega16
Jag använder följande kod för att ta emot kvittens från användaren:
START_LOOP: ;invänta startsignal
cbi PORTB,6 ;släck lysdiod
rcall delay20ms
sbi PORTB,6 ;tänd lysdiod
In TEMP,PINB
rcall delay20ms
sbi PINB,0x02 ;om PORTB, bit 2 = 1 så utför nästa rad
rjmp START_LOOP
När man kommer hit så ska man alltså loopa och snabbflämta en lysdiod tills användaren kvitterar. Men programmet stannar bara ett kort ögonblick och fortsätter som om en kvittens inkommit.
Jag har löst det genom att lyfta upp PINB,0x02 med ett motstånd på 1 kohm till plus. Användaren kvitterar genom att jorda PINB,0x02.
Om jag kollar i databladet så kopplas ett motstånd på 20 – 50 kohm in vid läsning av alla I/O. Det är en tree state med mosfet.
Varför störs det? Måste man koppla in ett extra motstånd för att inte få in skräp? I de hårdvaruexempel jag sett så har man kopplat alla I/O till avkopplingskondensator. Det har jag provat men det störs ut ändå. Jag håller på med en batteridriven grej och för att inte ladda ur batteriet vill jag ha så liten belastning som möjligt. Jag skulle i och för sig kunna koppla in och ur motstånden med t ex ett SIL-relä men det känns sunkigt…
/Harald
Jag använder följande kod för att ta emot kvittens från användaren:
START_LOOP: ;invänta startsignal
cbi PORTB,6 ;släck lysdiod
rcall delay20ms
sbi PORTB,6 ;tänd lysdiod
In TEMP,PINB
rcall delay20ms
sbi PINB,0x02 ;om PORTB, bit 2 = 1 så utför nästa rad
rjmp START_LOOP
När man kommer hit så ska man alltså loopa och snabbflämta en lysdiod tills användaren kvitterar. Men programmet stannar bara ett kort ögonblick och fortsätter som om en kvittens inkommit.
Jag har löst det genom att lyfta upp PINB,0x02 med ett motstånd på 1 kohm till plus. Användaren kvitterar genom att jorda PINB,0x02.
Om jag kollar i databladet så kopplas ett motstånd på 20 – 50 kohm in vid läsning av alla I/O. Det är en tree state med mosfet.
Varför störs det? Måste man koppla in ett extra motstånd för att inte få in skräp? I de hårdvaruexempel jag sett så har man kopplat alla I/O till avkopplingskondensator. Det har jag provat men det störs ut ändå. Jag håller på med en batteridriven grej och för att inte ladda ur batteriet vill jag ha så liten belastning som möjligt. Jag skulle i och för sig kunna koppla in och ur motstånden med t ex ett SIL-relä men det känns sunkigt…
/Harald
Det är ju sant om kvittensen från användaren är en puls. Men vad ska jag göra med de övriga insignalerna? Jag har sju Hex-vridströmställare. Det blir 28 I/O-pinnar. Till dessa skulle man ju kunna koppla in jordstiftet just innan man läser värdet men ska man verkligen behöva göra så? Kan störningar komma via matningsspänningen? Jag har ingen konding på kortet där processorn sitter. Kan det vara det som spökar?
/Harald
/Harald
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
En avstörningskonding vid processorn är aldrig en fel ide.
Men har du enablat pulluppen på inpinnarna?
Först se till att PDU-bitten är 0'a.
The Pull-up Disable PUD bit in SFIOR disables the pull-up function for all pins in all ports when set.
Sen så måste du skriva 1'or i PORTxn på dom pinnar som du vill ha pulluppen aktiverad på.
If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin. The port pins are tri-stated when a reset condition becomes active, even if no clocks are running.
Men har du enablat pulluppen på inpinnarna?
Först se till att PDU-bitten är 0'a.
The Pull-up Disable PUD bit in SFIOR disables the pull-up function for all pins in all ports when set.
Sen så måste du skriva 1'or i PORTxn på dom pinnar som du vill ha pulluppen aktiverad på.
If PORTxn is written logic one when the pin is configured as an input pin, the pull-up resistor is activated. To switch the pull-up resistor off, PORTxn has to be written logic zero or the pin has to be configured as an output pin. The port pins are tri-stated when a reset condition becomes active, even if no clocks are running.
Re: Störningar i I/O-port i ATMega16
sbi används för att sätta en bit i ett register, vad jag tror du tänkt använda är sbic (skip if bit in i/o register cleared)...Harald skrev: sbi PINB,0x02 ;om PORTB, bit 2 = 1 så utför nästa rad
rjmp START_LOOP
in TEMP,PINB <- vad är tänkt med denna rad?
Matseng,
Jag ska slänga in en 100 uF över matningsspänningen på kortet.
Intressant att man kan släppa pull-up-motståndet genom att initiera stiftet som out. Här kan jag ju få ner strömförbrukningen en hel del, för all initiering sker innan användaren trycker på startknappen.
Att man fått in alla dessa funktioner i denna lilla krets är imponerande…!
/Harald
Jag ska slänga in en 100 uF över matningsspänningen på kortet.
Intressant att man kan släppa pull-up-motståndet genom att initiera stiftet som out. Här kan jag ju få ner strömförbrukningen en hel del, för all initiering sker innan användaren trycker på startknappen.
Att man fått in alla dessa funktioner i denna lilla krets är imponerande…!
/Harald
Melker,
Jag har använt sbic. Jag skrev av fel från mitt program…
in TEMP,PINB <- vad är tänkt med denna rad?
Här läser jag PORTB och lägger resultatet i TEMP och det funkar… Om man läser en hel port så är det väl bara de bitar som är initierade som ingångar som påverkas? Förresten kollar jag därefter bara de bitar som är intressanta.
Faktum är att jag tycker att jag fått en viss ordning på det här nu efter att jag tidigare ställde en himla massa konstiga frågor här i forumet om räknenoggrannhet och räknare… Att stega igenom i simulatorn tycker jag är enormt bra. Saknar dock simulatorprogram för AT90S1200 som jag också tänkt använda i detta projekt.
/Harald
Jag har använt sbic. Jag skrev av fel från mitt program…
in TEMP,PINB <- vad är tänkt med denna rad?
Här läser jag PORTB och lägger resultatet i TEMP och det funkar… Om man läser en hel port så är det väl bara de bitar som är initierade som ingångar som påverkas? Förresten kollar jag därefter bara de bitar som är intressanta.
Faktum är att jag tycker att jag fått en viss ordning på det här nu efter att jag tidigare ställde en himla massa konstiga frågor här i forumet om räknenoggrannhet och räknare… Att stega igenom i simulatorn tycker jag är enormt bra. Saknar dock simulatorprogram för AT90S1200 som jag också tänkt använda i detta projekt.
/Harald
-
- Inlägg: 2360
- Blev medlem: 16 september 2003, 17:18:13
- Ort: Dubai, United Arab Emirates
- Kontakt:
En 100uF är säkert bra borta vid stabben på kortet. Men den är inte särskilt bra för att ta bort störningar från snabbt switchande logik. En 0.01uF till 0.1uF är mera lämpad för det. Använd så korta ledningar mellan störkällor och avstörningskondensatorerna som möjligt.
Om du har en vanlig 7805 stabb på kortet så se till att du har typ 0.1uF både framför och bakom den. Annars kan självsvängning uppstå i stabben och det kan ge ganska otrevliga resultat för resten av bygget.
Om du har en vanlig 7805 stabb på kortet så se till att du har typ 0.1uF både framför och bakom den. Annars kan självsvängning uppstå i stabben och det kan ge ganska otrevliga resultat för resten av bygget.