Derniers sujets
Mire à barres colorées avec Arduino.
2 participants
Page 1 sur 1
Mire à barres colorées avec Arduino.
Comme il n'existe que très peu de littérature concernant la programmation en assembleur avec l'IDE Arduino, eh bien j'ai entrepris d'écrire un bout de programme pour un Arduino Uno ou Nano afin d'en faire un générateur de mires à barre colorées.
Le générateur en question produira 4 signaux: R, V, B + Synchro composite en 525 lignes entrelacées à 60 Hz. Ces signaux devront être atténués pour respecter la norme car ils ont tous une amplitude de 5 volts.
Les timings de ces signaux sont conformes à ceux de la SMPTE S170m-2004, du moins ils sont exacts au µcycle d'horloge près (0,0625 µs avec un quartz de 16 MHz)
Le croquis se compile et se téléverse comme un croquis ordinaire.
Le générateur en question produira 4 signaux: R, V, B + Synchro composite en 525 lignes entrelacées à 60 Hz. Ces signaux devront être atténués pour respecter la norme car ils ont tous une amplitude de 5 volts.
Les timings de ces signaux sont conformes à ceux de la SMPTE S170m-2004, du moins ils sont exacts au µcycle d'horloge près (0,0625 µs avec un quartz de 16 MHz)
Au niveau de l'IDE Arduino, il faut créer un croquis (sketch) principal en ".ino" qui restera vide et un second fichier en ".s" avec le code assembleur.Line = 63.556 µs, µcycles = 1016.896 ≈ 1016 (nearest even number)
Half-line, µcycles = 1016 ÷ 2 = 508
Synchronisation pulse = 4.7 ±0.1 µs, µcycles = 75,2 ≈ 75
Equalization pulse = 2.3 ±0.1 µs, µcycles = 36,8 ≈ 37
Serration pulse = 4.7 ±0.1 µs, µcycles = 75,2 ≈ 75
Back Porch = 4.5 +0.2 µs, µcycles = 72
-0.1 µs
Front Porch = 1.5 ±0.1 µs, µcycles = 24
Active video starts:
• line 21 and ends with line 262 for the odd field
• line 284 and ends with line 525 for the even field
First field of one SMPTE 170M frame is odd, second is even.
Le croquis se compile et se téléverse comme un croquis ordinaire.
- Le croquis principal PatGen15.ino:
// 15 KHz RGB Pattern Generator
// Designed for Arduino Nano/Uno
//
// Project is pure assembly, this is why this ino file is empty.
//
// Outputs:
// PD2: Red
// PD3: Green
// PD4: Blue
// PD7: C.SYNC (combines both V.SYNC and H.SYNC)
//
// Arduino outputs can be be wired directly to the Monitor or via a buffer
// (LS125, LS367, ...) in order to protect your Arduino.
// C.SYNC combines both vertical and horizontal sync signals on a single pin.
// Most of the time, like with Hantarex Monitors, you can just use C.SYNC.
- Le fichier source PatGen15.s:
; 15 KHz RGB Pattern Generator
[Vous devez être inscrit et connecté pour voir ce lien] DDRD 0x0A
[Vous devez être inscrit et connecté pour voir ce lien] PortD 0x0B
[Vous devez être inscrit et connecté pour voir ce lien] PortD2 2
[Vous devez être inscrit et connecté pour voir ce lien] PortD3 3
[Vous devez être inscrit et connecté pour voir ce lien] PortD4 4
[Vous devez être inscrit et connecté pour voir ce lien] PortD7 7
[Vous devez être inscrit et connecté pour voir ce lien] PinDirection 0b11111100 // DDD2 to DDD7 as output
[Vous devez être inscrit et connecté pour voir ce lien] VideoDDR DDRD // Video (RGB + Synch) on port D
[Vous devez être inscrit et connecté pour voir ce lien] VideoPort PortD
[Vous devez être inscrit et connecté pour voir ce lien] Blank 0
[Vous devez être inscrit et connecté pour voir ce lien] Black Blank
[Vous devez être inscrit et connecté pour voir ce lien] Red (1 << PortD2)
#define Green (1 << PortD3)
#define Blue (1 << PortD4)
#define Cyan Green|Blue
#define Magenta Red|Blue
#define Yellow Red|Green
#define White Red|Green|Blue
#define RGB_Mask ~(Red|Green|Blue)
#define Csynch PortD7
#define OFF 0
#define ON ~OFF
#define Timer r16
#define LineCount r17
#define Field r18
#define Color r19
#define BarCount r20
#define Temp r21
.global main
; Set Csync pin state
.MACRO SetCsynch state ; Total 2 µcycles
.if \state == ON
cbi VideoPort, Csynch
.else
sbi VideoPort, Csynch
.endif
.ENDM
; Delay: from 1 µcycle (62,5 ns) till 1023 µcycles (63,9375 µs)
.MACRO Delay value ; Delay = value × 0,0625 µs
.if ((\value % 4) <> 0)
.rept (\value % 4)
nop
.endr
.endif
.if (\value >= 4)
ldi Timer, (\value / 4) ; 1 µcycle
1:
nop ; 1 µcycle
dec Timer ; 1 µcycle
brne 1b ; 2 µcycles when branching, only 1 otherwise
.endif
.ENDM
; Set color on the RGB pins:
; • RGB pins = macro argument if not blank
; • RGB pins = color previously read in "Colors" table if no argument
.MACRO SetRGBpins colorArg ; Total: 4 µcycles
in Temp, VideoPort ; 1 µcycle
andi Temp, RGB_Mask ; 1 µcycle
.ifnb \colorArg
ori Temp, \colorArg ; 1 µcycle
.else
or Temp, Color ; 1 µcycle
.endif
out VideoPort, Temp ; 1 µcycle
.ENDM
; Line = 63.556 µs, µcycles = 1016.896 ≈ 1016 (nearest even number)
; Half-line, µcycles = 1016 ÷ 2 = 508
; Synchronisation pulse = 4.7 ±0.1 µs, µcycles = 75,2 ≈ 75
; Equalization pulse = 2.3 ±0.1 µs, µcycles = 36,8 ≈ 37
; Serration pulse = 4.7 ±0.1 µs, µcycles = 75,2 ≈ 75
; Back Porch = 4.5 +0.2 µs, µcycles = 72
; -0.1 µs
; Front Porch = 1.5 ±0.1 µs, µcycles = 24
; Active video starts:
; • line 21 and ends with line 262 for the odd field
; • line 284 and ends with line 525 for the even field
; First field of one SMPTE 170M frame is odd, second is even.
main:
; PinMode(PortD, Direction)
ldi Temp, PinDirection
out VideoDDR, Temp
; Initialize outputs
cli
SetCsynch OFF
SetRGBpins Blank
Loop:
ldi LineCount,6 ; 6 pre-equalization pulses of 2.3 µs
PreEqu1:
SetCsynch ON ; 2 µcycles
Delay 35 ; Total = (35 + 2) × 0.0625 = 2.3125 µs
SetCsynch OFF ; 2 µcycles
Delay 466 ; Half-line completion, (508-37-1-2-2) µcycles
dec LineCount ; 1 µcycle
brne PreEqu1 ; 2 µcycles, next instruction included
ldi LineCount,6 ; 6 serration pulses of 4.7 µs
SerPuls:
SetCsynch ON ; 2 µcycles
Delay 431 ; Half-line filling, (508-75-2) µcycles
SetCsynch OFF
Delay 70 ; Total = (75-1-2-2), pulse = 4.6875 µs
dec LineCount ; 1 µcycle
brne SerPuls ; 2 µcycles, next instruction included
ldi LineCount,6 ; 6 post-equalization pulses of 2.3 µs
PostEq1:
SetCsynch ON ; 2 µcycles
Delay 35 ; Total = (35 + 2) × 0.0625 = 2.3125 µs
SetCsynch OFF ; 2 µcycles
cpi LineCount,1 ; 1 µcycle, check if last pulse
brne PostEq2 ; 1 µcycle, 2 if not
sbrs Field,0 ; Check field parity, line 272 reached if odd
PostEq2:
rjmp PostEq3 ; 2 µcycles
Delay (508+1) ; Half-line lengthening, post-egalization ends in middle of line 272
PostEq3:
Delay 461 ; (508-37-1-4-3-2) µcycles
dec LineCount ; 1 µcycle
brne PostEq1 ; 2 µcycles, next instruction included
ldi LineCount,11 ; 1 µcycle, 11 more lines to complete VBI
VBIrmd1:
SetCsynch ON ; 2 µcycles
Delay 73 ; Total = (73 + 2) × 0.0625 = 4.6875 µs
SetCsynch OFF ; 2 µcycles
Delay 1008 ; Blank line (1016-1-2-1-2-2) µcycles
dec LineCount ; 1 µcycle
breq VBIrmd2 ; 1 µcycle, 2 if last line
Delay 2 ; Loop adjustment
rjmp VBIrmd1 ; 2 µcycles
VBIrmd2:
ldi LineCount,242 ; 1 µcycle, 242 active lines
sbrs Field,0 ; Check field parity, 1 µcycle, 2 if odd field
inc LineCount ; One more line to manage first half of line 263 if even
Hsynch0:
SetCsynch ON ; 2 µcycles
Delay 73 ; Total = (73 + 2) × 0.0625 = 4.6875 µs
SetCsynch OFF ; 2 µcycles
cpi LineCount,1 ; 1 µcycle, check if last pulse
brne BakPorch1 ; 1 µcycle, 2 if not last line
sbrs Field,0 ; Check field parity, line 272 reached if odd
BakPorch1:
rjmp BakPorch2 ; 2 µcycles
Delay 493 ; (508-4-2-9) pre-egalization starts in middle of line 263
rjmp FrtPorch1 ; 2 µcycles
BakPorch2:
Delay 57 ; (72-5-10) µcycles, 4.5 µs for back porch
ldi BarCount,8 ; 1 µcycle
ldi r30, pm_lo8(Colors) ; Load Z register, total 2 µcycles
ldi r31, pm_hi8(Colors)
BarDisp:
lpm Color, Z+ ; 3 µcycles, read color of current bar
SetRGBpins ; Display bar, total 4 µcycles
Delay 96 ; (106-4-1-2-3) µcycles, 6.625 µs per bar
dec BarCount ; 1 µcycle
brne BarDisp ; 1 µcycle, 2 if not last bar
Delay 2 ; Last bar completion till 104 µcycles (6.5 µs)
SetRGBpins Blank ; 4 µcycles, preset RGB pins for the HBI
FrtPorch0:
Delay 15 ; (24-9) µcycles, 1.5 µs for front porch,
FrtPorch1:
dec LineCount ; 1 µcycle
breq FrtPorch2 ; 1 µcycle, 2 if last line
Delay 3 ; Same duration for the two outputs of the loop
rjmp Hsynch0 ; 2 µcycles
FrtPorch2:
inc Field ; 1 µcycle, new Field
rjmp Loop ; 2 µcycles
Colors:
.BYTE White,Yellow,Cyan,Green,Red,Magenta,Blue,Black
Dernière édition par Raffou le Lun 8 Jan - 12:29, édité 2 fois
Raffou- Modérateur principal
- Messages : 114
Date d'inscription : 21/12/2021
Re: Mire à barres colorées avec Arduino.
Bonjour "Raffou",
Tous mes veux pour ce nouvel essor et félicitations pour cet exercice qui me rappelle mes débuts avec Atmel en assembleur.
Maintenant pour conserver la souplesse du C j'utilise le compilateur CVAVR de Codevision : [Vous devez être inscrit et connecté pour voir ce lien]
Au plaisir dans de nouveaux projets,
Sylvain.
Tous mes veux pour ce nouvel essor et félicitations pour cet exercice qui me rappelle mes débuts avec Atmel en assembleur.
Maintenant pour conserver la souplesse du C j'utilise le compilateur CVAVR de Codevision : [Vous devez être inscrit et connecté pour voir ce lien]
Au plaisir dans de nouveaux projets,
Sylvain.
sylvain- Messages : 62
Date d'inscription : 23/12/2021
Sujets similaires
» Dépannage de volet roulant assisté par Arduino
» Alimentation avec deux LM723
» Problème avec un schéma ...
» J'ouvre le bal avec des barrettes RAM PC
» Graver des PCB avec une imprimante 3D
» Alimentation avec deux LM723
» Problème avec un schéma ...
» J'ouvre le bal avec des barrettes RAM PC
» Graver des PCB avec une imprimante 3D
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|
Hier à 16:08 par jmespe
» Laquelle ?
Hier à 11:52 par Bruno_Picard
» Cherche VARIAC ou assimilé
Sam 18 Mai - 21:47 par Bruno_Picard
» Discret 12
Ven 17 Mai - 9:04 par dreambox59
» mise en place cms
Jeu 16 Mai - 9:48 par LePetit
» Logo Cabasse
Mer 15 Mai - 18:11 par Bruno_Picard
» Projet de VU-mètre stéréo à tubes cathodiques 902 A
Dim 12 Mai - 14:24 par Bruno_Picard
» probleme transistors montés sur un même dissipateur
Sam 11 Mai - 15:57 par Roger33