hallo,

ik zou graag willen weten hoe je een schakelaar inleest. op het internet vind ik allemaal beschrijvingen in het engels.(hekel aan op school)

hoe kan je simpel je schakelaars inlezen en deze daarna aan een uitgang kopelen?

ledjes aan sturen is me nu gelukt heb een loop licht gemaakt.

ik ben bezig met de taal C

stef

Als je met avr's wil gaan werken dan moet je toch maar eens wat meer op school met engels opletten.

Zoek eens naar "input". Of misschien de search op dit forum?

Dit is echt het meest simpele dingetje waarmee je overspoeld wordt op internet.

Ja helaas zijn alle PDF's over avr's bijna altijd in het engels. Chinees ben ik ook tegengekomen :p.

JE hebt per poort van de avr die dan kan bestaan uit 8 bits 3 registers.

1 is uitgang register genaamg portB7 is uitgang van poort B bit 8

2 DDR register. Data direction of gegevens richting. Dit register bepaalt per bit of de poort een ingang of een uitgang is.

3 PIN register. Dit is het eigenlijke ingangs register.

Met DDB6 maak je dan poort B bit 7 ingang.
Met PINB6 kan je dan die ingang uitlezen.

oke

maar hoe ziet me programma er dan uit?

als ik bijvoorbeeld PD0 aan PB0 wil kopelen?

stef

Met C heb ik geen ervaring.

Maar zoiets al

PINB0 = PORTD0

Dan zal als B0 hoog word direkt uitgang D0 ook hoog worden.

Als je met C geen ervaring hebt is het dan niet handig om zo'n topic aan je voorbij te laten gaan i.p.v. een niet werkende oplossing aan te dragen?

Als deze syntax al zou werken wil je de waarde van PINB0 toewijzen aan PORTD0. Dus je zou ze minstens om moeten draaien (PORTD0 = PINB0).

Zo kan het wel en afhankelijk van de compiler kan het nog simpeler. Het gaat hier heel specifiek om 1 bit, de overige bits blijven ongemoeid.


if(PINB & (1 << PB0))
{
  PORTD |= (1 << PD0);
}
else
{
  PORTD &= ~(1 << PD0);
}

zo iets?

#include <avr/io.h>

int main()
{
// PB1/7 als output
DDRB = 0x7f;

DDRD = 0; // PORTD PD0-PD7 volledig als ingang

// oneindige lus
while(1)
{

if(PIND & (1 << PD0))
{
PORTB |= (1 << PB0);
}
else
{
PORTB &= ~(1 << PB0);
}
}

return 0;
}

het werkt alleen niet :(

moet ik er wel of geen pull up weerstand bij voegen?
en moet de schakelaar aan de gnd of de vcc?

oja de led brand nu continu

stef

Maak PORTD hoog terwijl hij als ingang geschakeld is, dan schakel je de interne pull-up weerstanden in.

[Bericht gewijzigd door pros op (30%)]

hoe moet je de interne pull up weerstand er in zeten

(sorry maar ik ben echt noob op dit gebied)
maar wil het heel graag leren

stef


#include <avr/io.h>

int main()
{
    PORTD = 0xFF;			// Alle pull-up's van PORTD activeren
    DDRB = 0x7F;			// PB1/7 als output

    while (1) {				// oneindige lus
	if (PIND & (1 << PD0)) {
	    PORTB |= (1 << PB0);
	} else {
	    PORTB &= ~(1 << PB0);
	}
    }
    return 0;
}

De "DDRD = 0;" instructie heb ik maar weggelaten - na een reset zijn alle pinnen sowieso als ingang geschakeld.

of ik doe iets goed fout of...

als ik de avr onder spanning zet brand de let.

als ik hem daarna nog een keer onder spanning zet maar tegelijk de toets in druk blijft de led uit. als ik dan de toest los laat gaat de led brande en gaat daarna niet meer uit.

ik heb de toets via gnd verbonden zonder pull up weerstand?

stef

Is dat met het brokje broncode dat ik postte? Dan geldt dit:

Het feit dat de LED oplicht bij het inschakelen is normaal. De interne pull-up weerstand maakt PD0 immers hoog. Maar de LED zou in ieder geval moeten doven als je PD0 --via een drukknop-- met GND verbindt.

Als je nog steeds jouw broncode gebruikt:
Plaats een externe weerstand (1k, 10k, 100k, wat je maar voorhanden hebt) tussen PD0 en Vcc.

met jou programma

verbinding aan de gnd

en hij blijft branden :S

heb je meschien msn? zo dat je hem me een keer goed kan uitlegen ipv telkens met berichtjes?

stef

Je moet niet téveel vragen van mensen he ;)

www.picbasic.nl kan je al een heel eind verder helpen. ookal gaat het daar over pic's en is de software anders.. de gedachte erachter is steeds dezelfde (mist een paar kleine details)

In ieder geval.. is de internet Pull up ingeschakeld ?

stel je gebruikt PORTB.0 als de input.. stuur dan door PORTB.0 een één signaal, zo wordt de pull up ingeschakeld

@stef110: ik heb --voor alle zekerheid-- dat dtukje broncode gecompileerd en in een ATmega32 geplaatst (en PD0 vervangen door PD3, omdat er een MAX232 PD0 in beslag neemt). Dat werkt perfect, zoals verwacht.
Als het bij jou niet werkt, kunnen daar verschillende redenen voor zijn: onstabiele voeding, slechte of ontbrekende ontkoppeling bij de voedingspinnen, een RESET-pin die wat gekke dingen doet, of nog iets anders...

Enne nee, ik heb geen msn.

met een pic gebruiken wij vaak het volgende stukje.

test_bit(portx,x);
set_bit(portx,x);

maar dit kan compiler afhankelijk zijn.

wil je het omdraaien poort laag dan de poort aan moet je een uitroepteken achter test_bit zetten.

of dit correct / werkt voor jou avr durf ik niet te garanderen.

Op 14 april 2008 14:20:18 schreef veenie:
met een pic gebruiken wij vaak het volgende stukje.

test_bit(portx,x);
set_bit(portx,x);

maar dit kan compiler afhankelijk zijn.

Reden ook dat ik een compiler onafhankelijk voorbeeld geef en expres geen gebruik maak van compiler specifieke extensies. We hebben vooralsnog ook geen enkel idee welke compiler stef110 gebruikt. Voor AVR zijn er namelijk nogal wat C compilers.

wil je het omdraaien poort laag dan de poort aan moet je een uitroepteken achter test_bit zetten.

of dit correct / werkt voor jou avr durf ik niet te garanderen.

AVR-GCC heeft daarvoor bit_is_clear(PORT, bit) en bit_is_set(PORT, bit), wat niet meer is dan een macro naar het door mij eerder gegeven voorbeeld. Overigens is dat helemaal niet het probleem, het voorbeeld is code technisch in orde. Met C code specifiek voor een bepaald PIC C compiler ga je hem niet verder helpen. Het is nu uitzoeken waar het probleem wel zit. Pros heeft al een mooie voorzet gegeven. Verder is het wellicht handig hier toch eens een schema/foto te plaatsen die aangeeft hoe een en ander exact is aangesloten om misverstanden uit te sluiten.

ik heb avrstudio 4 met avr gcc

stef

http://home.kabelfoon.nl/~herman25/fotos/electronica/atmega16.jpg

even snel een 10 seconden werk tekening gemaakt. als julie het duidelijker willen moeten julie het zegen maak ik er morgen eentje met eagle.

stef

Weerstand, LED en drukknop lijken me OK. Voedingsspanning is onduidelijk. Je hebt --naast AVcc en AGND (pinnen 30 en 31) toch ook Vcc en GND (pinnen 10 en 11) aangesloten?

En wat doe je met AGND en AVCC? Zoals je in de datasheet kan lezen moeten die ook aangesloten zijn, zelfs wanneer je de ADC niet gebruikt.

voeding is gewoon 5 volt gemaakt met een 7805 met een 1200UF condensator er voor en er komt presies 5.00 volt uit.

ik heb ik totaal 5 pinen voor de voeding

+ 10,32,30
- 11,31

en een 100n condenstarjte over de + en -

stef

Da's OK. Als je daarnaast ook de RESET-lijn keurig hebt aangesloten (pull-up weerstandje naar Vcc en C van 100n naar GND) kan ik me niet voorstellen dat het nog mis kan gaan.

dat laatste had ik nog niet maar net wel bij gevoegt en helaas nog niet.

zou je meschien het hex bestandje van jou atmega32 kunnen sturen test ik het daar op.

stef

't Is amper 480 bytes groot, dus kan ik het net zo goed posten:


:100000000C942A000C9445000C9445000C94450077
:100010000C9445000C9445000C9445000C9445004C
:100020000C9445000C9445000C9445000C9445003C
:100030000C9445000C9445000C9445000C9445002C
:100040000C9445000C9445000C9445000C9445001C
:100050000C94450011241FBECFE5D8E0DEBFCDBF14
:1000600010E0A0E6B0E0E2EAF0E002C005900D92F8
:10007000A036B107D9F710E0A0E6B0E001C01D92AC
:10008000A036B107E1F70C9447000C9400008FEF05
:1000900082BB8FE787BB809B02C0C09AFCCFC09811
:0200A000FACF95
:00000001FF