Atmega16 uitbreiden

Alle vragen m.b.t digitale schakelingen m.b.v. losse i.c's
en oplossingen m.b.v. PIC processoren.
Plaats reactie
Sjacheraar
Berichten: 53
Lid geworden op: za 18 feb 2012, 13:56
Locatie: . .

Atmega16 uitbreiden

Bericht door Sjacheraar »

Ik heb een AtMega16 welke ik gebruik om valsnelheden te meten.
Echter wil ik deze uitbreiden met een paar knopjes om het gewicht in te kunnen stellen van het te vallen object.
Het gewicht was in de eerste instantie niet van belang, er werd altijd met het zelfde gewicht gewerkt.
Maar nu verandert regelmatig het gewicht en wil ik ook de Joules kunnen meten van verschillende objecten / gewichten.
Hardware is geen probleem, die is aanwezig en werkt, en een paar knopjes extra aanbouwen is ook geen probleem.
Maar de software wel, dus is er iemand die mij als "non-programmeur" kan helpen om eea voor elkaar te krijgen ?
Programma is in C geschreven en vrij kort, geen gekke dingen zover ik kan zien of ben tegen gekomen.

Bedankt.
bask185
Berichten: 9
Lid geworden op: do 4 sep 2014, 9:45
Locatie: alkmaar

Bericht door bask185 »

ehm ik ben verward. Je bent een niet programmer maar je hebt wel een atmega16 aan de praat gekregen die met een of andere I2c accelerometer ofzo kan communiceren? En je kan niet eens een simpele I/O pin inlezen???

Om een I/O van een atmega te lezen, kan je gebruik maken de PIN instructie. Als je met de arduino IDE werkt, kan je digitalRead(); gebruiken.

De PIN instructie is vrij standaard en ziet er als volgt uit:

#define knop1 0b00001000

unsigned char x = PINB

if(x & knop1 > 0) { // als knop1 is ingedrukt, doe dit...
}

Om overzicht aan te leggen gebruik ik een define. Elke keer als je in je code knop1 tikt, staat er eigenlijk de binaire waarde 0b00001000. In dit voorbeeld komt dit overeen met pin 3 van port B (je moet van rechts lezen, de meest rechter bit komt overeen met pin B0)

Ik declareer een unsigned char genaamd x. Dat is een variabele type van 1 byte groot met een bereik van 0 tot 255 decimaal. En daar stop ik de waarde van port B in.

PINB is het input register van port B. De waarde van PINB komt overeen met de stand van de pinnen van poort B. Als op alle pinnen 5V staat dan bevat PINB de waarde 0b11111111. Als alleen pin B0 5V is, dan is de waarde 0b00000001 etc etc.

De & is een AND mask. Door de waarde van x te AND'en met knop1 ( of 0b00001000) kijkt de if functie alleen maar pin B3. Als x bijvoorbeeld de waarde 0x11111111 heeft dan is het resultaat van x & knop1 0x00001000. Als x de waarde 0x11110111 heeft dan is het resultaat 0b00000000. Beide bits moeten dus waar zijn om er een logische 1 uit te krijgen. Als ook maar 1 enkel bitje van x hoog is, dan is x > 0 en wordt de if functie uitgevoerd.

Alle pinnen zijn standaard ingesteld als INPUT dus daar hoef je niks aan te doen.
Sjacheraar
Berichten: 53
Lid geworden op: za 18 feb 2012, 13:56
Locatie: . .

Bericht door Sjacheraar »

Het is geen accelerometer, maar twee lichtsluisjes op 9 cm afstand van elkaar waar het doorheen valt.
Als je wilt kan ik je de code/schema eventueel toe sturen zodat je kan zien wat het programma doet.
Je krijgt dan waarschijnlijk meer inzicht in het geheel dan wat je nu hebt.

Alvast bedankt.
Sjacheraar
Berichten: 53
Lid geworden op: za 18 feb 2012, 13:56
Locatie: . .

Bericht door Sjacheraar »

Ik zie nu pas dat je in Alkmaar woont en wat wil het toeval....ik ook.

Ik heb het programma gekregen en ben zelf opzoek gegaan waar ik wat kan veranderen in het programma om de juiste waarde te krijgen die ik wil hebben.
Nadeel is dat ik telkens het doosje moet open maken en het programma moet uploaden naar de ATmega als ik wat verander.

Wat ik eigenlijk zou willen zijn 3 knopjes, knopje waarde veranderen aan, knopje hoger, knopje lager en dan weer terug met knopje waarde veranderen.

Ik ben in zijn geheel niet thuis in programmeren en zou niet weten wat ik waar moet zetten of aan moet sluiten.
Ben wel technisch op elektronica gebied, maar programma's schrijven is er nooit van gekomen.......iets te oud (63) voor.
Plaats reactie