[C++] USB moodlight met attiny45

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • godofal
  • Registratie: Maart 2010
  • Niet online

godofal

TACNAYN - destroyer of worlds

Topicstarter
ik heb het idee om een USB moodlight te maken en die via de USB aansturen.

maar nou weet ik weinig tot niks hoe ik die USB verbinding kan laten werken.
dat het kan weet ik wel (usbtiny stealth USB capslocker)

maar hoe ik het moet aansturen is een probleem.
waar kan ik info vinden over dit onderwerp?
en zijn er nog andere dingen die ik moet weten hiervoor? (ik dacht mischien een programma op de PC?)

en het faden van de ledjes krijg ik niet echt voor elkaar (met PWM)
ik snap het principe wel, maar de voorbeeldcodes begrijp ik niet, en ik dacht hetzelfde te kunnen bereiken met een loop.
dit is wat ik heb kunnen bedenken:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <avr/interrupt.h>    
#define F_CPU 100000UL        
#include <util/delay.h>

int main(){


  DDRB = 0xFF;            // alle pins op poort B als uitgang


  for(int A =1 ; A != -1; A++){     //nooit eindigende loop waarbij A steeds 1 meer waard wordt.


    PORTB = _BV(PB0); 
    _delay_ms(A);           //pin5/blouw hoog voor een steeds langer wordende tijd (A)

    PORTB &= ~_BV(PB0); 
   _delay_ms(10);           //pin5/blouw laag voor 10ms
   

  }

  return(0);
}


hier heb ik een plaatje van het schema, ziet er een beetje rommelig uit, maar het is redelijk duidelijk.
btw, ik heb er ook een ISP (6pin) aanhangen. en het lijkt mss onduidelijk bij de attiny, maar het is weldegelijk een attiny45, ik had alleen geen attiny45 in mijn eagle library, en attiny13 heeft dezelfde lay-out.
op dit moment zijn de 2 data lijnen van de USB niet aangesloten, omdat ik daar nog geen software voor heb en ik dacht dat het mischien schadelijk kon zijn om die aan te sluiten.

led1=groen
led2=rood
led3=blouw

Afbeeldingslocatie: http://i917.photobucket.com/albums/ad18/godofal/schematicwithoutheader.jpg

[ Voor 2% gewijzigd door NMe op 07-04-2010 17:39 . Reden: Table vervangen door code-tag ;) ]


Acties:
  • 0 Henk 'm!

  • LED-Maniak
  • Registratie: Oktober 2003
  • Nu online
Ik vind je code eerlijk gezegt niet helemaal logisch.

Voor een avr ziet de main er bijvoorbeeld zo uit:

code:
1
2
3
4
5
6
7
8
9
10
int main(void)
{
//hier initialiseer je spullen(poorten, pinnen, timers etc)

while(1)
{
      //hier komt je code in een never ending loop
}

}



Hoe jij het wil(wat ik begrijp uit je code):

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(void)
{
DDRB = (1<<PB0); //init port B, PB0 output

unsigned char Time;

while(1)
{

  PORTB |= (1<<PB0); //Pin high
  _delay_ms(Time);

  PORTB &= ~(1<<PB0); //Pin low
  _delay_ms(100);

  Time++;  //Timer increment, overflow @255+1

}

}

[ Voor 41% gewijzigd door LED-Maniak op 07-04-2010 17:44 ]

Mitsubishi externe temperatuur sensor (Home Assistant compatible): V&A - ClimaControl - Ook voor Panasonic & LG.


Acties:
  • 0 Henk 'm!

  • godofal
  • Registratie: Maart 2010
  • Niet online

godofal

TACNAYN - destroyer of worlds

Topicstarter
LED-Maniak schreef op woensdag 07 april 2010 @ 17:39:
Ik vind je code eerlijk gezegt niet helemaal logisch.

Voor een avr ziet de main er bijvoorbeeld zo uit:

code:
1
2
3
4
5
6
7
8
9
10
int main(void)
{
//hier initialiseer je spullen(poorten, pinnen, timers etc)

while(1)
{
      //hier komt je code in een never ending loop
}

}



Hoe jij het wil(wat ik begrijp uit je code):

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(void)
{
DDRB = (1<<PB0); //init port B, PB0 output
DDRB = (1<<PB1); //ik heb deze 2 ook nodig voor de andere kleuren
DDRB = (1<<PB2);
unsigned char Time;

while(1) 
{

  PORTB |= (1<<PB0); //Pin high
  _delay_ms(Time);

  PORTB &= ~(1<<PB0); //Pin low
  _delay_ms(100);           //met 100 Ms duurt het toch langer om hem helemaal aan te laten faden dan 10Ms?

  Time++;  //Timer increment, overflow @255+1
                // waarom deze hier en niet bij de while?

}

}
als het er niet logisch uiziet kan dat best, ik begin net met C++
ik had een voorbeeldcode gepakt waarin er 1 ledje aan en uit moest, dat gedeelte eruit gehaald en vervangen door een loop.
en die time++; dat had ik eerst ook, maar dat werkte niet, waarom weet ik niet.
bovendien, die
#include <avr/interrupt.h>
#define F_CPU 100000UL
#include <util/delay.h>
zijn toch ook nodig?

Acties:
  • 0 Henk 'm!

  • LED-Maniak
  • Registratie: Oktober 2003
  • Nu online
Nee, niet allemaal ;)

Gooi dit eens in avrstudio en compile het:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <avr/io.h>
#include <util/delay.h>
#define F_CPU 100000UL 


int main(void)
{
DDRB = (1<<PB0 | 1<<PB1 | 1<<PB2); //init port B, PB0 output

unsigned char Time;

while(1) 
{

  PORTB |= (1<<PB0 | 1<<PB1 | 1<<PB2); //Pin high
  _delay_ms(Time);         //Time wachten en dan verder

  PORTB &= ~(1<<PB0); //Pin low
  _delay_ms(100);           //100ms wachten en dan verder

  Time++;  //Timer increment, overflow @255+1
}

}


Die Time staat daar prima en zeker in je while, kijk maar eens goed naar de haakjes. Je kan een for loop gebruiken maar waarom zou je. Als je PWM wil maken pak je het toch compleet anders aan dan je nu hebt. Met dit kan je effectief de LED's laten knipperen op een veranderende snelheid(heel wat anders dan PWM!!!).

miliseconds is overigens met een kleine m anders staat er Mega seconds ;)
Daarnaast programmeer je in C en waarschijnlijk met GCC. Niet C++ dus.

Mitsubishi externe temperatuur sensor (Home Assistant compatible): V&A - ClimaControl - Ook voor Panasonic & LG.


Acties:
  • 0 Henk 'm!

  • godofal
  • Registratie: Maart 2010
  • Niet online

godofal

TACNAYN - destroyer of worlds

Topicstarter
ik gebruik programmers notepad, van winavr, en ik heb C++ aangeklikt, dus dat zou het moeten doen.
kan AVRstudio via de usbtiny programeren?

en waarom is PWM dan anders dan dit?

Acties:
  • 0 Henk 'm!

  • LED-Maniak
  • Registratie: Oktober 2003
  • Nu online
PWM heeft een veranderende duty cycle terwijl wat jij hebt een veranderende frequentie is.

AVRStudio is van atmel zelf en kan alle AVR's programmeren.

[ Voor 25% gewijzigd door LED-Maniak op 08-04-2010 14:12 ]

Mitsubishi externe temperatuur sensor (Home Assistant compatible): V&A - ClimaControl - Ook voor Panasonic & LG.


Acties:
  • 0 Henk 'm!

  • godofal
  • Registratie: Maart 2010
  • Niet online

godofal

TACNAYN - destroyer of worlds

Topicstarter
ik heb avrstudio4 gedownload en geinstalleerd, maar ik ben mijn programmer (usbtiny) vergeten mee te nemen, dus ik kan de code niet testen.
ja, ik weet dat de usbtiny niet standaard word ondersteund door avrstudio, maar ze hebben daar een truukje voor waardoor een STK500 geemuleerd wordt.
morgen kan ik het allemaal testen.

en dat stukje van veranderende duty cycle/frequentie snap ik niet helemaal.
het heeft toch beide gewoon hetzelfde principe om de led heel snel te laten knipperen?
het enige wat ik kan bedenken (weet niet eens zeker of het kan ;) ) is dat die PWM een oproepbare functie is terwijl die frequentie van mij steeds opnieuw moet worden geschreven.

en is er ergens op het net een beginners tutorial over AVR chips via de USB aansturen?

Acties:
  • 0 Henk 'm!

  • LED-Maniak
  • Registratie: Oktober 2003
  • Nu online
Bij jou veranderd de frequentie steeds doordat de periode langer wordt. Bij PWM veranderd de frequentie NIET.

Als je 50Hz hebt, dus 20ms. 100% aan is 20ms aan 0ms uit. 50% aan is 10ms aan, 10ms uit. 25% aan is 5ms aan, 15ms uit, enz. Je ziet dat het totaal dus altijd 20ms is en dus 50Hz.

Een AVR chip op USB is voor een beginner echt een no-go. Eerst maar eens C leren kennen en met interrupts leren werken voordat je met zulke materie aan de slag gaat.

Mitsubishi externe temperatuur sensor (Home Assistant compatible): V&A - ClimaControl - Ook voor Panasonic & LG.


Acties:
  • 0 Henk 'm!

  • godofal
  • Registratie: Maart 2010
  • Niet online

godofal

TACNAYN - destroyer of worlds

Topicstarter
ik wist dat ik het niet snel af zou krijgen, en ik ben ook niet van plan er nonstop aan te werken, ik was van plan om eerst het faden voor elkaar te krijgen, en wat info op te zoeken en kijken hoever ik kwam.

maar dank voor de uitleg over het verschil, ik ga zo kijken of het werkt ;)


edit:
ik heb het net geprogrameerd, en het werkt niet.
het enige wat ie doet is volle sterkte branden.
ik heb zowel met de delay als de time gespeeld, maar daardoor gaat ie alleen maar langzamer knipperen.
volgens mij moet ie veel sneller knipperen dan dit programmaatje kan om te faden...
zal nog eens een keer naar dat PWM kijken...
mss word ik er nu wel wijs uit ;)

[ Voor 39% gewijzigd door godofal op 09-04-2010 21:13 ]

Pagina: 1