ATmega168 vs ATtiny

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
ghost_rider
Inlägg: 2211
Blev medlem: 26 maj 2008, 21:48:15
Ort: Genarp

Re: ATmega168 vs ATtiny

Inlägg av ghost_rider »

Ja, jag har räknat på två pinnar till den.
hm, en spänningsdelare hade kanske varit något.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: ATmega168 vs ATtiny

Inlägg av snigelen »

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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ATmega168 vs ATtiny

Inlägg av jesse »

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.
snigelen
Inlägg: 815
Blev medlem: 8 maj 2009, 11:02:14
Ort: Lund

Re: ATmega168 vs ATtiny

Inlägg av snigelen »

Jag kom på att jag aldrig testat Charlieplexing. Efter lite klurande fick jag till detta

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;
}
Så nu har jag testat :).
bearing
Inlägg: 11676
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: ATmega168 vs ATtiny

Inlägg av bearing »

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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ATmega168 vs ATtiny

Inlägg av jesse »

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)
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.
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?

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.
Användarvisningsbild
ghost_rider
Inlägg: 2211
Blev medlem: 26 maj 2008, 21:48:15
Ort: Genarp

Re: ATmega168 vs ATtiny

Inlägg av ghost_rider »

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.
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ATmega168 vs ATtiny

Inlägg av jesse »

OK. Men då är det ju inga problem.
Användarvisningsbild
ghost_rider
Inlägg: 2211
Blev medlem: 26 maj 2008, 21:48:15
Ort: Genarp

Re: ATmega168 vs ATtiny

Inlägg av ghost_rider »

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?
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ATmega168 vs ATtiny

Inlägg av jesse »

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.
Användarvisningsbild
ghost_rider
Inlägg: 2211
Blev medlem: 26 maj 2008, 21:48:15
Ort: Genarp

Re: ATmega168 vs ATtiny

Inlägg av ghost_rider »

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
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: ATmega168 vs ATtiny

Inlägg av jesse »

>två resistorer som sitter i serie?
exakt.
Skriv svar