ATmega168 vs ATtiny
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: ATmega168 vs ATtiny
Ja, jag har räknat på två pinnar till den.
hm, en spänningsdelare hade kanske varit något.
hm, en spänningsdelare hade kanske varit något.
Re: ATmega168 vs ATtiny
Sen kan man driva upp till sex lysdioder på tre pinnar med Charlieplexing. Lite mer klurande, men när man klurat färdigt kan ett timer-avbrott sköta hela det jobbet.
Re: ATmega168 vs ATtiny
Om man ska kunna programmera om med resetpinnen avaktiverad krävs att man har en högspänningsprogrammerare. Jag har inte koll på vilka programmerare som har den funktionen.
Det finns ett ännu enklare sätt att läsa "tristate" med en enda pinne... Du ansluter kontaktens två "ytterpoler" till + och -. Mittuttaget till ingången via ett motstånd på kanske 4k7. På in-pinnen sätter du sedan en liten kondensator i serie med ett lågt motstånd. (t.ex. 0.22 nF och 10 ohm). Man känner av ingången genom att först sätta pinnen som utgång och ge ut +5V, sedan byta till ingång och läsa av. upprepa med 0V ut och sedan läsa av. Om kontakten är i mittenläget kommer kondensatorn att "minnas" spänningen på pinnen. Om kontakten är sluten mot + eller - kommer kondensatorn att snabbt laddas ur den vägen (ca 0.7-1.5 µS). Du får två läsresultat som kan ge tre kombinationer:
00 = kontakt sluten till GND
10 = kontakt i mittenläget
11 = kontakt sluten till +5V
(01 kan ej uppstå)
möjligtvis måste man vänta ett par mikrosekunder mellan avläsningarna, men det går snabbare än ADC.
Det finns ett ännu enklare sätt att läsa "tristate" med en enda pinne... Du ansluter kontaktens två "ytterpoler" till + och -. Mittuttaget till ingången via ett motstånd på kanske 4k7. På in-pinnen sätter du sedan en liten kondensator i serie med ett lågt motstånd. (t.ex. 0.22 nF och 10 ohm). Man känner av ingången genom att först sätta pinnen som utgång och ge ut +5V, sedan byta till ingång och läsa av. upprepa med 0V ut och sedan läsa av. Om kontakten är i mittenläget kommer kondensatorn att "minnas" spänningen på pinnen. Om kontakten är sluten mot + eller - kommer kondensatorn att snabbt laddas ur den vägen (ca 0.7-1.5 µS). Du får två läsresultat som kan ge tre kombinationer:
00 = kontakt sluten till GND
10 = kontakt i mittenläget
11 = kontakt sluten till +5V
(01 kan ej uppstå)
möjligtvis måste man vänta ett par mikrosekunder mellan avläsningarna, men det går snabbare än ADC.
Re: ATmega168 vs ATtiny
Jag kom på att jag aldrig testat Charlieplexing. Efter lite klurande fick jag till detta
Så nu har jag testat
.
Kod: Markera allt
/*
* Charlieplexing six leds on three outputs.
*
* See Wikipedia for shematic:
* http://en.wikipedia.org/wiki/Charlieplexing#Expanding:_tri-state_logic
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
// TIMSK on tinyX5, tinyX313. TIMSK0 on tinyX4, megaXX4, megaX(X)8.
#ifndef TIMSK0
#define TIMSK0 TIMSK
#endif
// Bit 0 to 5 indicates if a led should be on or off.
volatile uint8_t leds;
// Macros to turn on/off led nr i. 0 <= i <= 5.
#define LED_ON(i) (leds |= (1<<(i)))
#define LED_OFF(i) (leds &= ~(1<<(i)))
// LEDS on PB2, PB3, PB4
#define LEDPORT PORTB
#define LEDDDR DDRB
#define LEDPIN1 (1<<2)
#define LEDPIN2 (1<<3)
#define LEDPIN3 (1<<4)
#define LEDMASK (LEDPIN1 | LEDPIN2 | LEDPIN3)
// Tells which pin should be high for each LED. Could be in PROGMEM.
const uint8_t port_patterns[6] = {
LEDPIN1,
LEDPIN2,
LEDPIN2,
LEDPIN3,
LEDPIN3,
LEDPIN1
};
// Tells which pins should be output for each LED.
const uint8_t ddr_patterns[6] = {
LEDPIN1 | LEDPIN2,
LEDPIN1 | LEDPIN2,
LEDPIN2 | LEDPIN3,
LEDPIN2 | LEDPIN3,
LEDPIN1 | LEDPIN3,
LEDPIN1 | LEDPIN3
};
int main(void)
{
uint8_t i;
// Use timer0 overflow interrupt to update leds
TCCR0B = (1 << CS01) | (1 << CS00); // Prescaler 1:64
TIMSK0 = (1 << TOV0); // Enable overflow interrupt
sei(); // Enable global interrupts
while (1) {
for (i = 0; i < 6; i++) {
LED_ON(i);
_delay_ms(80);
}
for (i = 0; i < 6; i++) {
LED_OFF(i);
_delay_ms(80);
}
}
}
// Timer0 overflow interrupt. Update LEDs.
ISR(TIMER0_OVF_vect)
{
static uint8_t current_led = 0;
// Clear led port and ddr
LEDDDR &= ~LEDMASK;
LEDPORT &= ~LEDMASK;
if (leds & (1 << current_led)) {
// Turn on current led
LEDDDR |= ddr_patterns[current_led];
LEDPORT |= port_patterns[current_led];
}
if (++current_led >= 6)
current_led = 0;
}

Re: ATmega168 vs ATtiny
Man borde ju kunna driva 4 lysdioder med bara 2 I/O.
Koppla varje par av lysdioder mot (eller från) varandra, över matningsspänningen. Koppla en resistor från mittpunkten av varje par till en I/O. Är I/O utgång och hög lyser den ena lysdioden i paret, är den låg lyser den andra, och är den ingång lyser inte någon. Med multiplexing kan man få alla att lysa.
4 LED och en växlande brytare borde alltså gå att fixa med 3 I/O.
Koppla varje par av lysdioder mot (eller från) varandra, över matningsspänningen. Koppla en resistor från mittpunkten av varje par till en I/O. Är I/O utgång och hög lyser den ena lysdioden i paret, är den låg lyser den andra, och är den ingång lyser inte någon. Med multiplexing kan man få alla att lysa.
4 LED och en växlande brytare borde alltså gå att fixa med 3 I/O.
Re: ATmega168 vs ATtiny
snigelen skrev:Men vad är det du behöver? Ett par knappar och en PWM-utgång? I så fall går det väl med vilken MCU som helst om inte programmet är för stort.
ghost_rider skrev:Jag behöver : (som jag har löst det)
1pwm utgång
2-3 digitala ingångar
3 digitala utgångar
(om man skulle intregera det med en LED driver så behöver man såklart fler)
hmmm... först talas det om en pwm-utgång, och tre digitala utgångar, sedan fyra lysdioder.... hur ser det ut egentligen???? Vad ska du ha på utgångarna egentligen?ghost_rider skrev:designen är väldigt enkel.
En attiny45* 1 vippbrytare med tre lägen (on-off-on) och fyra smd leds
1 led visar att det är ström i kretsen de andra tre ska visa vilket 'steg' som är aktiverat.
Dvs. trycker man brytaren upp ska den första led börja lysa, då steg 1 är aktiverat. +1 = steg 2 osv.
trycker man på andra håller blir det såklart minus ett steg.
Och antalet ingångar ....2-3 st...? Men om det nu går att lösa switchen med en enda ingång, då har du 4 ben kvar på kretsen att använda som utgångar.
Men så har du en pwm-utgång också? Du förklarar inte vad den är till för? Ska den lysdioden dimmas på nåt vis? Hur och varför?
Eller är det de tre lysdioderna som är kopplade till var sin utgång som alla tre dimmas med pwm-signalen?
När du beskriver funktionen här ovan så ser jag bara att tre lysdioder ska anslutas till processorn. (den fjärde sitter ju mellan V+ och GND). Jag ser överhuvud taget inget om varför det finns en led-drivare och en pwm-signal?
Det verkar finnas många frågetecken här....
Hur som helst så verkar ju antalet pinnar räcka gott och väl. En ingång. tre utgångar plus en pwm.
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: ATmega168 vs ATtiny
Så svårt är det väl inte
attiny'n läser responenen ifrån vippbrytaren, antingen +1 eller -1.
Har en kod på chippet som räknar från 0-3.
Beroende på vilket 'steg' den står på t.ex om steg 2 är aktiverat så skall två av tre smd leds lysa (ja totalt 4,men den första är bara för att visa att det är ström på kretsen).
PWM signalen skall gå till led drivaren för dimming utav 3 stycken P7:or.

attiny'n läser responenen ifrån vippbrytaren, antingen +1 eller -1.
Har en kod på chippet som räknar från 0-3.
Beroende på vilket 'steg' den står på t.ex om steg 2 är aktiverat så skall två av tre smd leds lysa (ja totalt 4,men den första är bara för att visa att det är ström på kretsen).
PWM signalen skall gå till led drivaren för dimming utav 3 stycken P7:or.
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: ATmega168 vs ATtiny
hm, om jag lyckas att få en ingång över så skulle jag vilja använda den som 'batterimätare'.
Har sökt lite på nätet, men får inte riktigt kläm på matten.
Batterierna är på ~14v och 8,8A. Dessa batterier skall inte gå under 3v/cell o då tänkte jag att man kanske kunde kombinera mina 4 smd leds till att indikera när det närmar sig.
någon som sitter på en bra länk?
Har sökt lite på nätet, men får inte riktigt kläm på matten.
Batterierna är på ~14v och 8,8A. Dessa batterier skall inte gå under 3v/cell o då tänkte jag att man kanske kunde kombinera mina 4 smd leds till att indikera när det närmar sig.
någon som sitter på en bra länk?
Re: ATmega168 vs ATtiny
Du kan kombinera en LED-utgång med ADC-ingång. Du behöver ju bara kolla batterinivån kanske var 10:e sekund eller ännu mer sällan. Under den korta tiden du mäter är LED:en släckt. (någon millisekund). För att kunna mäta inspänningen behöver du dela matningen ner till en nivå under LED:ens framspänning, dvs max 2 volt. Det gör du med en spänningsdelare i storleksordningen 10-30 kiloohm. Sen behöver ju attiny'n ha en intern spänningsreferens som passar.
Att börja använda multiplexerkretsar för att få fler in/utgångar kan motverka syftet - det blir bara mer komplicerat och tar upp minst lika mycket plats som en 14-pinnars. Då kan man likaväl ta en 14-pinnars direk.
Men , som sagt, spänningsmätning kan kombineras med en LED, om det nu är en "vanlig" LED som sitter mellan µC-pinne och gnd.
Att börja använda multiplexerkretsar för att få fler in/utgångar kan motverka syftet - det blir bara mer komplicerat och tar upp minst lika mycket plats som en 14-pinnars. Då kan man likaväl ta en 14-pinnars direk.
Men , som sagt, spänningsmätning kan kombineras med en LED, om det nu är en "vanlig" LED som sitter mellan µC-pinne och gnd.
- ghost_rider
- Inlägg: 2211
- Blev medlem: 26 maj 2008, 21:48:15
- Ort: Genarp
Re: ATmega168 vs ATtiny
Det låter fint.
En spänningsdelare, det är väl bara igenteligen två resistorer som sitter i serie? (strömdelare har två i paralell?)
Ja det är helt vanliga ytmonterade leds
En spänningsdelare, det är väl bara igenteligen två resistorer som sitter i serie? (strömdelare har två i paralell?)
Ja det är helt vanliga ytmonterade leds