| ||||||||||||||
![]() |
[Voor 9% gewijzigd door Ibex op 19-05-2009 07:14]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Dit topic is onderdeel van een reeks. Ga naar het meest recente topic in deze reeks.
| ||||||||||||||
![]() |
[Voor 9% gewijzigd door Ibex op 19-05-2009 07:14]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Het probleem:Sprite_tm schreef op maandag 18 mei 2009 @ 23:27:
Je progde toch in assembly voor de AVR? Houd je er dan rekening mee dat je labels tellen in instructies (=16bit) terwijl lpm een byte-adres nodig heeft? Zo moet 't:
code:
1 2 3 4 5 ldi zlo,low(mijn_data*2) ldi zhi,high(mijn_data*2) lpm ;r0 bevat nu 0xa5 mijn_data: .db 0xa5
[norml][H][e][l][o][W][r][l][d][/norml]
1
2
3
4
5
6
| [$][@][7][&][#][(][D][>] ; gedurende 1 seconde, de tekens zijn iets anders in werkelijkheid [!][a][,][?][-][^][_]["] ; nogmaals 1 seconde [r][l][d][H][e][l][o][W] ; deze verkapte string gedurende 2 seconden [#][#][#][#][#][#][#][#] ; een fractie van een seconde [!][%][,][=][@][l][z][~] ; 1 seconde ; en dan gaat het terug naar lijn 3 om zo de hele tijd deze laatste drie lijnen te herhalen. |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
| ;... .def temp = r16 .def character = r17 .def position = r18 .def argument = r19 .def registerselect = r20 .def databyte = r24 .def addressbyte = r25 .def working1 = r26 ;... displaytekst: ldi ZH, high(message << 1) ldi ZL, low(message << 1) clr working1 startdisplay: lpm character, Z+ tst character breq messagewritten mov position, working1 rcall writechar inc working1 rjmp startdisplay messagewritten: ret writechar: mov temp, position ; 0b?????xxx andi temp, 0b00000111 ; 0b00000xxx ori temp, 0b00011000 ; 0b00011xxx -> add A4 and A3 ori temp, 0b11100000 ; 0b11111xxx -> set nCE, nWR and nRD andi character, 0b01111111 mov addressbyte, temp mov databyte, character rcall writedata ret writedata: mov temp, addressbyte mov argument, addressbyte ldi registerselect, 0b00000000 rcall loadbyte mov argument, databyte ldi registerselect, 0b00000001 rcall loadbyte andi temp, 0b01111111 ; lower nCE mov argument, temp ldi registerselect, 0b00000000 rcall loadbyte andi temp, 0b10111111 ; lower nWR mov argument, temp ldi registerselect, 0b00000000 rcall loadbyte ori temp, 0b01000000 ; set nWR mov argument, temp ldi registerselect, 0b00000000 rcall loadbyte ori temp, 0b10000000 ; set nCE mov argument, temp ldi registerselect, 0b00000000 rcall loadbyte ret loadbyte: rcall loadbit ;bit 7 lsl argument rcall loadbit ;bit 6 lsl argument rcall loadbit ;bit 5 lsl argument rcall loadbit ;bit 4 lsl argument rcall loadbit ;bit 3 lsl argument rcall loadbit ;bit 2 lsl argument rcall loadbit ;bit 1 lsl argument rcall loadbit ;bit 0 rcall strobeSTCP ret loadbit: sbrs argument, 7 rjmp clearDS setDS: sbi PORTB, 0 rjmp endloadbit clearDS: cbi PORTB, 0 endloadbit: rcall strobeSHCP cbi PORTB, 0 ret ;... message: .db "HeloWrld",0,0 |
1
2
3
4
5
6
7
8
9
10
11
12
| ldi character, 'H' ldi position, 0b00000000 rcall writechar ldi character, 'e' ldi position, 0b00000001 rcall writechar ldi character, 'l' ldi position, 0b00000010 rcall writechar ldi character, 'o' ldi position, 0b00000011 rcall writechar |
Voorlopig nog niets concreet. Maar het was alweer een twee jaar geleden (ongeveer) dat ik nog eens serieus geknutseld had met electronica. Maar nu ik een nieuw appartement heb met een huge bureau, kan ik terug lekker aan de slag gaan, zonder 's avonds alles te moeten opruimen
[Voor 36% gewijzigd door Ibex op 19-05-2009 07:58]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
[Voor 8% gewijzigd door Ibex op 21-05-2009 11:18]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
1
2
3
4
5
6
7
8
9
| mov position, temp2 mov character, temp3 rcall writechar inc temp2 sbrc temp2, 3 ldi temp2, 0b00000000 inc temp3 sbrc temp3, 7 ldi temp3, 0b00000000 |
[Voor 4% gewijzigd door Ibex op 21-05-2009 12:53]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
[Voor 55% gewijzigd door Ibex op 21-05-2009 23:43]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
HeheIbex schreef op donderdag 21 mei 2009 @ 15:27:
. Het moet een bug zijn in gavrasm. Ik heb nu eventjes AVR studio 4 op mijn oude windowslaptop geinstalleerd (damnnn, dat ding is traag) en dan met remote desktop eventjes mijn .asm gebuild en naar mijn microcontroller geflashed, en het ding werkt gewoon perfect...
Nu vraag ik me toch echt af waar die bug zit...
In de releasenotes:Hello.
Please be aware that a new version of the AVR command line assembler gavrasm
has been released. This version corrects two serious errors, so please use
this newer version.
En inderdaad, de .hex files zijn nu identiek tussen AVR studio en gavrasm.May 2009: Version 2.3
- Corrected: Serious error when addressing register ZL (R30).
- Corrected: Error when using the -x option (only external def.inc)
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Sprite_tm schreef op zondag 14 juni 2009 @ 19:02:
Heb je hardware en software flow control (ctrl-a o 'serial port setup') wel uitstaan? Die kunnen namelijk ervoor zorgen dat een te verzenden byte in een queue komt te staan inplaats van daadwerkelijk verzonden te worden.
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
De telefoon loopt inderdaad direct naar de modem, en ze zitten inderdaad beiden op dezelfde 12V voeding (waarbij voor de telefoon de 12V nog even naar 6V gebracht word door een LM2575). Maar daar alle twee de toestellen DC input hebben (waarbij de + en de - dus duidelijk zijn, niet zoals bij een stopcontact, waar 1 draad de lijn is en de andere neutraal terwijl je niet weet welke wat is), zou ik verwachten dat ze beiden dezelfde kabel nemen. Bovendien zou dit probleem zich dan toch ook voordoen wanneer ze op hun "normale" adapter zitten?goeievraag schreef op zaterdag 05 september 2009 @ 16:34:
@Ibex: Als die telefoon aan je modem hangt, en beide hangen aan de zelfde voeding, zou het kunnen dat het telefoonsignaal naar de massa getrokken wordt:
Stel dat het modem ader1 van de telefoonkabel aan de massa heeft, en het signaal op ader2. Als je telefoon het net andersom heeft, wordt het telefoonsignaal kortgesloten op het moment dat je de massa's doorverbindt. Als je gewoon nog 'klassiek' belt is het onwaarschijnlijker, het hangt allemaal af van hoe de signalen in je modem/splitter lopen.
[Voor 12% gewijzigd door Ibex op 05-09-2009 16:54]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Dit snap ik nog niet volledig. Mijn microcontroller kan maximaal tegen 20MHz data serieel naar het (idd) SIPO schuifregister klokken. Het heeft minimaal 2 kloktikken nodig per bit om deze in het schuifregister te laden, plus dan nog eens minimaal 1 om de 8 bits op de uitgang te plaatsen. Dit dus een 17 kloktikken in totaal. En dan geen rekening gehouden met zaken die de microcontroller tussentijds moet doen. En eer een uitgang op het schuifregister van staat veranderd, moeten opnieuw alles serieel in het schuifregister geschoven worden, en weer alles op de uitgangen geplaatst worden. Dus een rise en fall op een uitgang van het schuifregister zou toch minimaal 34 kloktikken moeten duren, ofte < 1MHz.ssj3gohan schreef op dinsdag 26 oktober 2010 @ 21:11:
[...]
Als je een SIPO schuifregister zou hebben worden 8 opeenvolgende samples op de datalijn in 1 attiny-cycle verwerkt, dus zou je 8 keer zo snel als het kristal moeten kunnen samplen. Dat is de enige manier waarop hij sneller kan samplen dan zijn kloksnelheid. Er zit geen PLL in die dingen ofzo.
[Voor 6% gewijzigd door Ibex op 27-10-2010 07:49]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
| void latch() { PORTB &= ~(1 << PB2); PORTB |= (1 << PB2); PORTB &= ~(1 << PB2); } void strobe_clock() { PORTB &= ~(1 << PB1); PORTB |= (1 << PB1); PORTB &= ~(1 << PB1); } void shift_byte(uint8_t byte) { uint8_t tempbyte = byte; for (uint8_t i = 0; i < 8; i++) { tempbyte = byte; tempbyte = tempbyte >> i; tempbyte &= 1; if (tempbyte == 1) { PORTB |= (1 << PB0); } else { PORTB &= ~(1 << PB0); } strobe_clock(); } } |
1
| for (uint8_t i = 0; i < 8; i++) |
1
| for (uint8_t i = 7; i >= 0; i--) |
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Deze code werkt wel, maar heeft nog steeds het probleem dat het de volgorde van de bits omdraait. De for aanpassen helpt ook hier niet. Deze code is overigens wel iets netterDaWaN schreef op zondag 14 november 2010 @ 20:33:
[...]
Misschien iets met de initialisatie van i ? Bij de meeste compilers mag je i niet declareren in de for loop zelf.
Ik zou de code zelf trouwens alsvolgt schrijven:
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 void shift_byte(uint8_t byte) { uint8_t i; for (i = 0; i < 8; i++) { if (byte & (1 << i)) { PORTB |= (1 << PB0); } else { PORTB &= ~(1 << PB0); } strobe_clock(); } }
Daar heb je een punt. Het is inderdaad netter om "standaard" types te gebruiken. Als ik me niet vergis zijn dit de standaard types:LED-Maniak schreef op zondag 14 november 2010 @ 20:35:
[...]
Declareren van i mag prima in de for loop. Zelf hou ik niet zo van de compiler specific uint8_t. Liever gebruik ik gewoon "unsigned char i".
[Voor 34% gewijzigd door Ibex op 14-11-2010 21:07]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
base_ schreef op maandag 15 november 2010 @ 16:11:
[...]
Moet je eens met je hiel in een DIP16 gaan staan! Had toen ook een schroevedraaier nodig...
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
[Voor 8% gewijzigd door Ibex op 16-11-2010 20:00]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
[Voor 72% gewijzigd door Ibex op 18-11-2010 22:15]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Dit was inderdaad de oplossing. Ik heb me ondertussen even goed ingelezen in het gedrag van PNP en NPN transistors, zodat ik ook echt begrijp wat er gebeurd. Dat maakt het allemaal een pak logischer.ssj3gohan schreef op donderdag 18 november 2010 @ 22:40:
[...]
Specifieke reden waarom je dat wilt doen?
Als je hem direct aan de microcontroller hangt kan er een hoge spanning op je uitgangspin komen te staan. Dan kun je het beste de basis van de PNP weer aan de collector van een NPN hangen, de emitter van die NPN aan ground hangen en de basis van de NPN aan je micro knopen. Zowel voor de basis van de NPN als PNP een weerstandje hangen en you're good to go.
Hetzelfde verhaal, maar dan NPN=N-channel en PNP=p-channel kun je uitvoeren met MOSFETs.
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| (+) | +--+--+ | | ---X W | | +--+--+ | ================ | W | (led) | (-) |
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
[Voor 58% gewijzigd door Ibex op 30-12-2010 21:27]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Ik vraag me dan af hoe chineese producenten dit zoveel goedkoper kunnen krijgen. Wellicht een combinatie van een meer geautomatiseerd process, mindere kwaliteit en goedkopere werkkrachten?CyBeR schreef op donderdag 22 september 2011 @ 02:10:
[...]
Een beetje laat bij dit feestje, maar nee, ze zetten er geen twee mensen op. Beduidend meerVoor m'n werk laat ik pcb's door hen maken (inderdaad, als er iets mis is sturen ze screenshots en weetikveel wat op; ze hebben zelfs een open circuit die ik over het hoofd gezien heb gespot) en de vorige keer dat ik iets bestelde zag ik dat ze filmpjes gemaakt hebben over hoe ze dat nou daadwerkelijk doen: http://www.eurocircuits.c...g-a-pcb-eductional-movies
(Dat 't geen miljoen euro kost voor 10 stuks verbaast me.)
Overigens heb ik bij hen ook wel extra gekregen hoor. Vorige keer had ik 3x een panel besteld (met daarop 10x 2 losse bordjes). Het duurde forever dat ik erachter kwam want ik vergeet altijd wat ik bestel, maar ik bemerkte opeens dat na er drie gebruikt te hebben, er nog drie in m'n handen had
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| uint8_t shift_byte_in(void) { uint8_t loadedbyte = 0; for (uint8_t i = 0; i < 8; i++) { IN_PORT &= ~(1 << IN_CLK); IN_PORT |= (1 << IN_CLK); if (IN_PIN & (1 << IN_SER)) { loadedbyte |= (1 << i); } IN_PORT &= ~(1 << IN_CLK); } return loadedbyte; } uint64_t shift_int64_in(void) { uint64_t byte; uint64_t int64 = 0; for (uint8_t i = 0; i < 8; i++) { byte = 0 | shift_byte_in(); int64 |= byte << (i * 8); } return int64; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
| uint8_t calculate_button_address(uint64_t button) { uint8_t buttonaddress = 0; for (uint8_t i = 0; i < 64; i++) { if (button & (1 << i)) { break; } buttonaddress++; } return buttonaddress; } |
1
2
3
4
| uint64_t inputs = shift_int64_in(); if (inputs) { uint8_t buttonaddress = calculate_button_address(inputs); |
[Voor 5% gewijzigd door Ibex op 17-12-2011 22:55]
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Ik zie ook niet direct een verklaring waarom dit de oorzaak zou zijn, maar het is wel een potentiele bug. Even testen dusSprite_tm schreef op zondag 18 december 2011 @ 10:20:
Mijn gok is dat je (1<<i) geinterpreteerd word als een int, waardoor de 1 er bij waardes boven 16 uitvalt. Je zou ((uint64_t)1<<i) oid kunnen proberen. Ik kan daar niet meteen mee verklaren waarom er 0xf uit blijft komen en niet 0x40 tho'.
IN_PORT is gewoon een alias van PORTD, IN_PIN van PIND. IN_CLK en IN_SER zijn alias voor resp.PD6 en PIND5 waarop de shiftregisters zijn aangesloten. Ik doe het twee keer aan het begin en het einde om ervoor te zorgen dat het steeds juist staat.Wirf schreef op zondag 18 december 2011 @ 11:48:
[...]
code:
1 2 3 4 5 6 7 for (uint8_t i = 0; i < 8; i++) { IN_PORT &= ~(1 << IN_CLK); [...] IN_PORT &= ~(1 << IN_CLK); [...] }
Misschien is dat hierom? Dat je in de loop, die 8 keer uitgevoerd wordt, twee keer "IN_PORT &= ~(1 << IN_CLK);" doet?
edit: Wat doen IN_PORT, IN_CLK, IN_PIN en IN_SER eigenlijk?
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Dit was het dus effectief. ThanksSprite_tm schreef op zondag 18 december 2011 @ 10:20:
Mijn gok is dat je (1<<i) geinterpreteerd word als een int, waardoor de 1 er bij waardes boven 16 uitvalt. Je zou ((uint64_t)1<<i) oid kunnen proberen. Ik kan daar niet meteen mee verklaren waarom er 0xf uit blijft komen en niet 0x40 tho'.
Archlinux - Rode gronddingetjes zijn lekker - Komt uit .be
Dit topic is gesloten.
Google Pixel 7 Macbook Pro 2023 16" Apple iPhone 14 Samsung Galaxy S23 Hogwarts Legacy Samsung Galaxy Z Fold4 LG G2 OLED evo Gallery Edition Nintendo Switch Lite
Tweakers is samen met
Hardware Info,
AutoTrack,
Gaspedaal.nl,
Nationale Vacaturebank,
Intermediair en
Independer
onderdeel van
DPG Media B.V.
Alle rechten voorbehouden © 1998 - 2023
•
Hosting door True
Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.
Meer informatie vind je in ons cookiebeleid.
Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.
Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details
Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details
Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.
Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details