Hallo mensen,

Ik heb het idee opgevat om een booster voor de modelbouwtreinbaan te maken die digitaal de gebruiker de status geeft. Bijvoorbeeld hoeveel hij boost. Dit wil ik doen met een LCD en een ATmega32 denk ik.

Ik wil hiervoor het schema van de TAMS booster van Conrad gebruiken zie:

http://www2.produktinfo.conrad.com/datenblaetter/200000-224999/214013-…

Denken jullie dat dit schema te gebruiken is voor het booster gedeelte en dat ik dan het boostsignaal aftap en bijvoorbeeld d.m.v. een ADC laat verwerken op mijn AVR en dan op de LCD zet?

Is de boostspanning uberhaupt variabel of werkt deze booster met een gaan met die banaan principe en boost hij altijd. Ik denk het niet maar met zijn allen komen we verder!

Het is de bedoeling dat er 4 boosters in 1 behuizing komen en dat je dan d.m.v. buttons tussen de boosters kan switchen.

Heeft iemand verder nog leuke ideeën rondom dit topic?
Ps: ik programmeer in C (AVR-GCC)

Groeten,

Nico

Je zou kunnen constant de stroom (via weerstandje) en spanning meten, en zo controleren hoeveel vermogen je baan gebruikt. Ook alle beveiligingen kan je zo digitaal aansturen/tonen.

Die booster zal constant het signaal naar +18V versterken, als ik zo ff de pdf snel doorlees. Je mag niet meerdere boosters op dezelfde stroomkring zetten, dan doen ze elkaar kapot, je moet het signaal van de regelaar naar elke booster doen, en elke booster stuurt een elektrisch geisoleerd stukje van je modelbaan aan.

Nee ook niet alle boosters komen bij elkaar. De baan is verdeeld in blokken dus dat moet goed gaan.

Hoe kan ik een externe interrupt gebruiken in AVR-GCC in combinatie met de ATmega32?
Ik wil namelijk een interrupt pin van de AVR aan de korstluitbeveiligingslijn hangen. deze lijn geeft een signaal af (moet nog even kijken wat voor signaal) als er een kortsluiting optreedt.
Als de AVR dan een 1 of 0 op die pin krijgt moet hij direct naar een andere routine( op lcd plaatsen iets als: klortsluitbeveliging aangeproken e.d.).

Maar ik heb geen verstand van externe interrupts, wie kan mij helpen?

Groeten Nico

Een extern interrupt werkt niets anders als bijvoorbeeld een timer interrupt. Gewoon een interrupt routine aanmaken met de juiste interrupt vector.


SIGNAL(SIG_INT0)
{
 doeiets();
}

De vector SIG_INT0 is dacht ik standaard, maar controleer anders even de header file die AVRGCC meelevert voor de ATMega32.

Dan natuurlijk de registers voor je interrupt goed instellen. Zie datasheet. En als laatste globale interrupt afhandeling inschakelen met sei();

Moet ik nog een bepaalde interrupt file includen?
Bijvoorbeeld interrupt.h

@Marcel
Bij dit voorbeeld:

SIGNAL(SIG_INT0)
{
doeiets();
}

kan de doeiets() routine ok bijvoorbeeld een switch/case of if/else instructie zijn?

Ik wil namelijk via de interrupt meten of ergens de kortsluitingsbeveiliging is aangesproken. Ik heb 4 boosters elke booster heeft een kortsluitbeveiliging, ik wil dan alle kortsluitbeveiligingen aan de interruptpin hangen. En dan nog weer elke kortsluitbeveiliging van elke booster apart aan een pin hangen zodat ik nadat een interrupt is geconstateerd nog kan meten welke booster dat was.

Dit weet ik niet hoe dat moet:

Dan natuurlijk de registers voor je interrupt goed instellen. Zie datasheet. En als laatste globale interrupt afhandeling inschakelen met sei();
/*edit
void enable_external_int(uint8_t ints);
en
void sei(void); //is dit goed??

Marcel bedankt voor je reactie misschien kan je me nog verder helpen!

Je moet inderdaad de avr/interrupt.h header includen. Als je nog een oudere AVRGCC hebt ook nog avr/signal.h

doeiets(); was slechts een voorbeeld je kan alle mogelijke C code in je interrupt routine opnemen. Maar een stelregel is om je interrupt routines altijd zo kort mogelijk te maken. Dus je maakt het beste een simpele routine die de poorten controleert en dat in een variabele opslaat. Waarna je vervolgens weer verder gaat met je hoofdprogramma. In je hoofdprogramma controlleer je dan de waarde van die variabele.


#include <avr/io.h>
#include <avr/interrupt.h>

volatile unsigned char boosterStatus;

SIGNAL(SIG_INT0)
{
  boosterStatus = PINB & 0x0f;
}

int main()
{
  while(1)
  {
    if(boosterStatus != 0)
    {
       geefEenError();
    }
  }

  return 0;
}

Hoe je de registers moet instellen? Kijk eens op pagina 64 van de datasheet. Daar lees je dat je de registers MCUCR en GICR moet instellen. Dat doe je gewoon als volgt. Code is slecht een voorbeeld, de juiste waardes moet je zelf even uit de datasheet halen.


MCUCR = (1 << ISC01) | (1 << ISC00);
GICR = (1 << INT0);

thnx Marcel ik ga dit ff proberen, je hebt er echt veel moeite voor gedaan! Dank je wel ik meld me wel als het gelukt is (zal wel ff duren denk ik...)